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?
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
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()
.
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();