web-dev-qa-db-fra.com

Si l'appel onComplete est effectué pour un sujet RxJava, dois-je me désinscrire manuellement à nouveau?

J'utilise un RxJava ReplaySubject dans mon fragment.

J'essaie d'utiliser le ReplaySubject d'une manière, où j'aimerais que le sujet exécute un processus jusqu'à la fin (peut-être au-delà de la durée de vie du fragment).

À la fin du processus, je voudrais libérer les ressources qui, si je comprends bien, se font en désinscrivant l'abonnement au moment de l'inscription de l'observateur (qui dans mon cas, est le sujet lui-même).

Dans ce fil de discussion github @benjchristensen dit:

S'il s'agit d'un observable, il doit émettre un onCompleted et être terminé.

S'il s'agit d'un observateur, il doit se désabonner de l'abonnement qu'il a reçu lorsqu'il a appelé Observable.subscribe et cela donnera à l'observable une chance de s'arrêter et de se nettoyer.

S'il s'agit d'un Sujet - qui est à la fois un Observateur et un Observable - quel est le comportement? Si j'appelle Terminé sur le sujet, cela signifie-t-il essentiellement que l'abonnement est arrêté, et je suis donc soulagé de devoir annuler manuellement l'abonnement que j'obtiens en enregistrant l'observateur?

43
Kaushik Gopal

Les sujets sont une couche relativement mince au-dessus d'un observable qui vous permet d'alimenter les appels onNext(), onCompleted() et onError() d'une source externe à l'observable. Leur comportement de désabonnement est le même qu'un observable. Si onCompleted() ou onError() sont appelés sur le sujet, les abonnés seront désabonnés. Pas besoin d'appeler unsubscribe() sur l'abonnement retourné par Observable.subscribe().

Pour un ReplaySubject, notez que les ressources ne seront pas nettoyées tant qu'elles ne seront pas récupérées. Même après que onCompleted() a été appelée sur un ReplaySubject, un abonné peut toujours s'abonner et il recevra tous les onNext(), onCompleted() ou onError() appels effectués avant l'abonnement.

62
kjones