Ich benutze den Interval-Operator, und ich möchte weiterhin Elemente ausgeben, auch wenn eine Exception in meiner Pipeline passiert.Interval funktioniert weiter nach onErrorResumeNext
Also versuche ich onErrorResumeNext
verwenden ein Element im Ausnahmefall emittieren. Aber ich habe gesehen, dass nach diesem Punkt das Intervall keine weiteren Elemente mehr emittiert.
Hier mein Gerät testen.
@Test
public void testIntervalObservableWithError() {
Subscription subscription = Observable.interval(50, TimeUnit.MILLISECONDS)
.map(time -> "item\n")
.map(item -> item = null)
.map(String::toString)
.onErrorResumeNext(t-> Observable.just("item with error emitted"))
.subscribe(System.out::print, t->{
System.out.println(t);
}
);
TestSubscriber testSubscriber = new TestSubscriber((Observer) subscription);
testSubscriber.awaitTerminalEvent(20000, TimeUnit.MILLISECONDS);
}
Ich bin mit diesem Verhalten verwirren, warum die beobachtbare abmelden, wenn Es ist ein Element Empfang von onErrorResumeNext
LÖSUNG:
Nach einigen Erklärungen, merke ich, dass, wenn ein Fehler passiert die beobachtbaren t's komplett. Also schließe ich das Observable ein, das eine Ausnahme in eine andere Observable haben kann und ich benutze flatMap. Also, dann die Haupt Observable weiter emittieren Elemente.
@Test
public void testIntervalObservableWithError() {
Observable.interval(100, TimeUnit.MILLISECONDS)
.map(time -> "item\n")
.flatMap(item -> Observable.just(item)
.map(String::toString))
.subscribe(System.out::print);
TestSubscriber testSubscriber = new TestSubscriber();
testSubscriber.awaitTerminalEvent(5000, TimeUnit.MILLISECONDS);
}
Wenn wurde leider jeder Betreiber, der alle diese Magie tun kann, was ich wissen möchte.
Regrads
Hallo, bitte lesen Sie mein Codebeispiel. Ich benutze onErrorResumeNext und es funktioniert nicht. – paul
Ich habe zuerst Ihren Code gelesen. In Ihrem Fall ist es unmöglich, 'interval' am Leben zu halten, da Sie' .map (String :: toString) 'auf einem NULL-Element aufrufen, der Stream wird sofort mit einem Fehler beendet und dieser Fehler wird von' onResumeErrorNext() 'abgefangen sendet ein Element und stream ruft "onComplete" auf. Das ist die Antwort auf Ihre Frage ** Warum die beobachtbare abbestellen? **. Auch ich habe meine Antwort aktualisiert. –
Und wieder aktualisiert. –