2014-09-02 3 views
40

Ich benutze eine RxJava ReplaySubject in meinem Fragment.Wenn der onComplete-Aufruf für einen RxJava-Betreff erfolgt, muss ich mich dann manuell wieder abmelden?

Ich bin versucht, die ReplaySubject in einer Art und Weise zu verwenden, wo ich das Thema möchte einen Prozess bis zum Abschluss (möglicherweise über das Leben des Fragments) auszuführen.

Nach Abschluss des Prozesses möchte ich die Ressourcen freisetzen, die - wie ich verstehe - durch Abbestellen des Abonnements zum Zeitpunkt der Registrierung des Beobachters erfolgt (was in meinem Fall das Thema selbst ist).

In diesem github issue thread @benjchristensen sagt:

Wenn es ein beobachtbar ist, dann sollte es eine OnCompleted emittieren und durchgeführt werden.

Wenn es sich um einen Observer handelt, sollte er sich von dem Abonnement abmelden, das er beim Aufruf von Observable.subscribe erhalten hat. Dadurch erhält das Observable eine Chance, herunterzufahren und aufzuräumen.

Wenn es ein Subjekt ist, das sowohl ein Beobachter als auch ein beobachtbares ist, wie ist das Verhalten? Wenn ich onComplete zum Thema anrufe, bedeutet das im Grunde genommen, dass das Abonnement beendet wird, und ich bin daher erleichtert, das Abonnement, das ich bekomme, manuell abzumelden, indem ich den Beobachter registriere?

Antwort

56

Themen sind eine relativ dünne Schicht oben auf einem Observable, die Sie onNext(), onCompleted() und onError() Anrufe von einer Quelle außerhalb der Observable führen können. Ihr Abmeldeverhalten ist dasselbe wie bei einem Observable. Wenn onCompleted() oder onError() zum Betreff aufgerufen werden, werden die Abonnenten abgemeldet. Keine Notwendigkeit, unsubscribe() auf dem Abonnement, das von zurückgegeben wird, aufzurufen.

Für eine ReplaySubject, beachten Sie, dass Ressourcen nicht gereinigt werden, bis es Müll gesammelt wird. Auch nach onCompleted() wurde angerufen ReplaySubject, ein Abonnent kann immer noch abonnieren und es wird alle ursprünglichen onNext(), onCompleted() oder onError() Anrufe erhalten, die vor dem Abonnieren gemacht wurden.

+0

guter Punkt auf dem ReplaySubject. –

+0

Gilt das auch für .cache- und .replay-transformierte Observables? – Zardoz

+1

Wird das irgendwo in der Dokumentation erwähnt? Ich habe buchstäblich 1 Stunde damit verbracht, bevor ich diesen Thread gefunden habe. –

Verwandte Themen