2016-11-03 4 views
3

Ich muss benachrichtigt werden, wenn sich etwas an meinem Observablen anmeldet. Ich muss auch benachrichtigt werden, dass meine Observable entweder fehlerhaft oder vollständig ist. Also dachte ich, ich sollte doOnSubscribe implementieren:Wann sollte doOnTerminate vs doOnUnsubscribe verwendet werden?

eine Aktion registrieren zu nehmen, wenn ein Beobachter abonniert einem beobachtbare

und doOnTerminate:

eine Aktion registrieren zu nehmen, wenn ein beobachtbares Abgeschlossen, entweder erfolgreich oder mit einem Fehler

Dann sah ich doOnUnsubscribe:

eine Aktion registrieren zu nehmen, wenn ein Beobachter Abmeldungen von einem beobachtbare

und dachte, die Symmetrie der doOnSubscribe/doOnUnsubscribe besser wäre.

Also, wird doOnTerminate immer vor doOnUnsubscribe aufgerufen werden? Wenn ich nur wissen will, dass die Dinge "erledigt" sind, ist es wirklich wichtig, was ich wähle?

+0

DoOnTerminal hat folgende Definition: "Ändert die Quelle Observable so, dass sie eine Aktion aufruft, wenn sie onCompleted oder onError aufruft". Es ist völlig anders als doOnUnsubscribe. Wenn Sie ein Abonnement für eine heiße Observable haben, von der Sie sich abmelden, erhalten Sie einen Aufruf von doOnUnsubscribe, und das Observable wird weiterhin Werte produzieren. Wenn Sie benachrichtigt werden möchten, wenn das Observable "erledigt" ist (onComplete, onError), würden Sie doOnTerminate verwenden. Wenn Sie über den erfolgreichen Abschluss wissen möchten, würde ich doOnCompleted verwenden. –

Antwort

8

Die Art der Abmeldung in Ihrem reaktiven Fluss wird bestimmen, welche von doOnUnsubscribe oder doOnTerminate Sie verwenden können. Im Folgenden können die Fälle sein:

beobachtbare Abschluss/Fehler löst abmelden
In einem solchen Szenario sowohl doOnTerminate und doOnUnsubscribe mit doOnTerminate wird genannt zuerst aufgerufen werden.

Im folgenden Beispiel werden beide mit den Endungen und abbestellt gedruckt.

Subscription subscribe = Observable.empty() // source terminates immediately 
    .subscribeOn(Schedulers.newThread()) 
    .doOnTerminate(() -> System.out.println("terminated")) 
    .doOnUnsubscribe(() -> System.out.println("unsubscribed")) 
    .subscribe(); 

TimeUnit.SECONDS.sleep(1); 
subscribe.unsubscribe(); // by this time already unsubscribe would have happened 

programatic Anruf abzumelden, bevor beobachtbare
In einem solchen Szenario schließt nur doOnUnsubscribe aufgerufen. Die Wahrscheinlichkeit, dass dies passiert, ist häufiger, wenn Sie eine Quelle haben, die unendlich läuft, oder eine Quelle, die heiß ist wie eine beobachtbare Option für Benutzerklicks.

Das folgende Beispiel druckt nur abgemeldet.

+0

brilliant! Vielen Dank. – tir38

+0

große Antwort !! Hilft viel. Schöne Grüße –

Verwandte Themen