2016-04-17 2 views
0

Возможно ли повторная подписка на Observable и получить ошибку?Получить сообщение об ошибке и переадресации

Метод Observable<T> retry() возвращает подписку на наблюдаемое, но он потребляет ошибку.

final PublishSubject<Integer> observable = PublishSubject.create(); 
observable 
    .flatMap(new Func1<Integer, Observable<Integer>>() { 

     @Override 
     public Observable<Integer> call(final Integer integer) { 
      if (integer % 2 == 0) { 
       return Observable.just(integer); 
      } else { 
       return Observable.error(new Exception("int: " + integer)); 
      } 
     } 
    }) 
    .retry() 
    .subscribe(new Action1<Integer>() { 

        @Override 
        public void call(final Integer integer) { 
         Timber.i("integer: %d", integer); 
        } 
       }, 
       new Action1<Throwable>() { 

        @Override 
        public void call(final Throwable throwable) { 
         Timber.e(throwable, "throwable"); 
        } 
       }, 
       new Action0() { 

        @Override 
        public void call() { 
         Timber.w("onCompleted"); 
        } 
       }); 

Observable 
    .range(0, 10) 
    .delay(2, TimeUnit.MILLISECONDS) 
    .subscribe(new Action1<Integer>() { 

        @Override 
        public void call(final Integer integer) { 
         observable.onNext(integer); 
        } 
       }, 
       new Action1<Throwable>() { 

        @Override 
        public void call(final Throwable throwable) { 
         observable.onError(throwable); 
        } 
       }, 
       new Action0() { 

        @Override 
        public void call() { 
         observable.onCompleted(); 
        } 
       }); 

onError часть observable никогда не вызывается, потому что .retry() потребляет ошибку.

ответ

1

То, что вы ищете, это retryWhen(). Это позволяет вам передать Func1, который предоставит вам Throwable, что означает, что вместо этого вы можете разместить логику onError.

Это хорошо article.

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