2016-04-17 16 views
0

Ist es möglich, ein Observable erneut zu abonnieren und den Fehler zu erhalten?Fehler erhalten und erneut abonnieren

Die Methode Observable<T> retry() führt das Observable erneut durch, aber es verbraucht den Fehler.

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(); 
        } 
       }); 

Der onError Teil observable heißt nie, weil .retry() den Fehler verbraucht.

Antwort

1

Was Sie suchen, ist retryWhen(). Dies ermöglicht es Ihnen, eine Func1 übergeben, die Sie mit der Throwable bietet, das heißt, Sie können stattdessen Ihre onError Logik dort platzieren.

Dies ist eine gute article.

Verwandte Themen