2015-11-05 2 views
5

Я хочу достичь этого, если я вызываю метод Obervable.subscribe(Action1), он не выбрасывает OnErrorNotImplementedException в любом месте, но если я вызываю Obervable.subscribe(Action1, Action1), второе действие вызывается, когда ошибка возникает как обычно. Я попробовал два способа:Предотвращение OnErrorNotImplementedException

.onErrorResumeNext(Observable.empty()) 

Этот способ OnErrorNotImplementedException не кинули, однако, если я прохожу также второе действие, действие никогда не вызывается либо.

Второе:

.lift(new Observable.Operator<T, T>() { 
    @Override 
    public Subscriber<? super T> call(Subscriber<? super T> subscriber) { 
     return new Subscriber<T>() { 
      @Override 
      public void onCompleted() { 
       if (!subscriber.isUnsubscribed()) { 
        subscriber.onCompleted(); 
       } 
      } 

      @Override 
      public void onError(Throwable e) { 
       if (!subscriber.isUnsubscribed()) { 
        try { 
         subscriber.onError(e); 
        } catch (Throwable t) { 
         if (!(t instanceof OnErrorNotImplementedException)) { 
          throw t; 
         } 
        } 
       } 
      } 

      @Override 
      public void onNext(T t) { 
       if (!isUnsubscribed()) { 
        subscriber.onNext(t); 
       } 
      } 
     }; 
    } 
}); 

Проблема с этим, если observeOn() называется позже, то это будет асинхронно и, очевидно, моя обработка исключений здесь не будет работать.

Есть ли способ достичь этого. Хотелось бы, чтобы был subscribe() метод, который не бросает OnErrorNotImplementedException в onError.

ответ

8

вот как мы это делаем на работе. Вместо того, чтобы делать какие-то действия, мы сделали абстракцию NYTSubscriber, которая реализовала onError и onCompleted. Таким образом, вы можете использовать этот абонент и только реализовать функцию обратного вызова onNext ИЛИ вы можете переопределить OnError и OnCompleted при необходимости

public abstract class NYTSubscriber<T> extends Subscriber<T> { 

@Override 
public void onCompleted() { 
} 

@Override 
public void onError(Throwable e) { 
} 
} 
+1

Спасибо! Да, это путь. Моя проблема заключается в том, что таким образом я теряю синтаксис лямбда в подписчике, и мне всегда приходится добавлять анонимные классы. :( – WonderCsabo

+0

По-видимому, нет другого пути, кроме передачи пустой 'onError()' реализации, либо с лямбдой, либо подклассами. Поэтому я принимаю этот ответ. – WonderCsabo

+0

Проверьте мое решение ниже @WonderCsabo – FireZenk

8

Вот еще один из возможных решений, вы можете определить onNext и метательного (также вы не можете потерять лямбда синтаксис):

.subscribe(t -> doSomething(t), e -> showError(e)); 
+1

Спасибо! Ну, мое намерение не добавлялось во всяком случае, манекен на Error. Но поскольку другого решения нет, я делаю сейчас. – WonderCsabo

0

когда вы делаете, как этот «.onErrorResumeNext (Observable.empty())» ваш поток будет завершен, когда возникает ошибка - вот почему ваши действия никогда не вызывается. Вы можете использовать '.retry()', и ваш поток будет перезагружен автоматически при возникновении ошибки.

Смежные вопросы