web-dev-qa-db-fra.com

Comment désinscrire PublishSubject et BehaviorSubject?

Sous le package subjects, vous avez des classes comme PublishSubject et BehaviorSubject qui, je suppose, peuvent être décrites comme un exemple utilisable Observables.

Comment peut-on se désinscrire de ces sujets? Il n'y a pas de méthode unsubscribe et appeler onCompleted met fin à l'Observable, n'est-ce pas?

36
arinte

Un sujet est un Observable et un Observer en même temps, il peut être désabonné de tout comme les observables normaux. ce qui rend le sujet spécial, c'est qu'il est en quelque sorte un pont entre les observables et les observateurs. il peut passer à travers les éléments qu'il observe en les réémettant et il peut également émettre de nouveaux éléments. les sujets sont aux observables comme les promesses sont aux futurs.

voici une brève description de la famille des sujets:

AsyncSubject : n'émet que la dernière valeur de la source Observable

BehaviorSubject : émet l'élément le plus récemment émis et tous les éléments suivants de la source Observable lorsqu'un observateur s'y abonne

PublishSubject : émet tous les éléments suivants de la source Observable au moment de l'abonnement

ReplaySubject : émet tous les éléments de la source Observable, quel que soit le moment où l'abonné s'abonne.

le doc officiel est livré avec de beaux diagrammes en marbre qui le rendent plus facile à comprendre

68
Septem

Les sujets sont essentiellement les deux observables et observateurs.

Un observable est essentiellement une chose qui a une fonction qui prend un observateur et renvoie un abonnement. Ainsi, par exemple, étant donné simple observable:

    Observable<Integer> observable = Observable.create(new Observable.OnSubscribeFunc<Integer>() {
        @Override
        public Subscription onSubscribe(Observer<? super Integer> observer) {
            observer.onNext(3);
            observer.onNext(2);
            observer.onNext(1);
            observer.onCompleted();

            return Subscriptions.empty();
        }
    });

Et ici, nous y souscririons, pour imprimer une ligne pour chaque entier:

    Subscription sub = observable.subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer integer) {
            System.out.println(integer);
        }
    });

Vous vous désinscrire sur ce qui précède en appelant sub.unsubscribe().

Voici un PublishSubject qui fait à peu près la même chose:

    PublishSubject<Integer> publishSubject = PublishSubject.create();
    Subscription subscription = publishSubject.subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer integer) {
            System.out.println(integer);
        }
    });

    publishSubject.onNext(3);
    publishSubject.onNext(2);
    publishSubject.onNext(1);

Vous vous désinscrire de la même manière, en appelant subscription.unsubscribe().

25
martiansnoop

Toutes les Subjects étendent Observable auxquelles vous pouvez vous abonner en utilisant l'une des multiples méthodes subscribe(...). L'appel à l'une des méthodes subscribe(...) renvoie un Subscription.

Subscription subscription = anySubject.subscribe(...);

Utilisez la méthode unsubscribe() de cette instance de subscription lorsque vous souhaitez arrêter d'écouter les événements du sujet.

subscription.unsubscribe();
5
Praveer Gupta