2016-07-04 10 views

Antwort

8

Sie von einem Fehler mit einem anderen Observable, beispielsweise wieder aufnehmen kann:

Observable<String> data = ... 
data.timeout(1, TimeUnit.SECONDS) 
    .onErrorResumeNext(Observable.empty()) 
    .subscribe(...); 
+0

Das ist, was dieser Code tut. Es wird Ihren Fehler in ein Observable umwandeln, das sofort beendet wird. – dwursteisen

+1

Es ist erwähnenswert, dass diese Lösung nicht funktioniert, wenn die Möglichkeit besteht, dass Fehler von weiterem Upstream kommen, weil es auch diese fangen wird ... – forresthopkinsa

3

Sie können immer onErrorResumeNext verwenden, die den Fehler bekommen und Sie können emittieren, was Artikel wollen- Sie

/** 
* Here we can see how onErrorResumeNext works and emit an item in case that an error occur in the pipeline and an exception is propagated 
*/ 
@Test 
public void observableOnErrorResumeNext() { 
    Subscription subscription = Observable.just(null) 
              .map(Object::toString) 
              .doOnError(failure -> System.out.println("Error:" + failure.getCause())) 
              .retryWhen(errors -> errors.doOnNext(o -> count++) 
                    .flatMap(t -> count > 3 ? Observable.error(t) : Observable.just(null)), 
                Schedulers.newThread()) 
              .onErrorResumeNext(t -> { 
               System.out.println("Error after all retries:" + t.getCause()); 
               return Observable.just("I save the world for extinction!"); 
              }) 
              .subscribe(s -> System.out.println(s)); 
    new TestSubscriber((Observer) subscription).awaitTerminalEvent(500, TimeUnit.MILLISECONDS); 
} 
+0

Ich möchte Stream beenden, nachdem onError – pixel

+0

Sie, in onErrorResumenNext Sie Ihre beobachtbare emittieren, die es wird die Pipeline zu beenden. Führe den Test aus, den ich geschrieben habe, und du wirst es verstehen. Wenn Sie mehr praktische Beispiele sehen möchten, überprüfen Sie hier https://github.com/politrons/reactive – paul

0

Eine einfachere Lösung, die Observable.timeout nicht verwendet (es wird also kein Fehler mit dem Risiko des Einfangens unerwünschter Ausnahmen generiert), könnte einfach dauern, bis ein Timer abgeschlossen ist es:

Observable<String> data = ... 
data.takeUntil(Observable.timer(1, TimeUnit.SECOND)) 
    .subscribe(...);