Как отменить подписку на PublishSubject и BehaviorSubject?
Под subjects
Пакет у вас есть классы, как PublishSubject
а также BehaviorSubject
который, я полагаю, может быть описан как полезный образец Observables
,
Как можно отписаться от этих тем? Здесь нет unsubscribe
метод и вызов onCompleted
Заканчивает Наблюдаемое в целом, верно?
3 ответа
Предмет является Observable
и Observer
в то же время, он может быть отписан от обычных наблюдений. что делает предмет особенным, так это то, что он является своего рода мостом между наблюдаемыми и наблюдателями. он может проходить через предметы, которые он наблюдает, переиздавая их, и он также может испускать новые предметы. субъекты являются наблюдаемыми, как обещания - будущим.
Вот краткое описание предметов семьи:
AsyncSubject: только испускает последнее значение исходного Observable
BehaviorSubject: испускает последний испущенный элемент и все последующие элементы источника, наблюдаемого, когда на него подписывается наблюдатель
PublishSubject: испускает все последующие элементы исходного Observable во время подписки
ReplaySubject: испускает все элементы исходного Observable, независимо от того, когда подписчик подписывается.
официальный документ поставляется с несколькими красивыми мраморными диаграммами, которые облегчают понимание
Субъекты, по сути, являются Наблюдаемыми и Наблюдателями.
Observable - это, по сути, вещь, которая имеет функцию, которая берет Observer и возвращает подписку. Так, например, даны простые наблюдаемые:
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();
}
});
И здесь мы подписались бы на это, чтобы распечатать строку для каждого целого числа:
Subscription sub = observable.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println(integer);
}
});
Вы бы отписались по вышеуказанному, позвонив sub.unsubscribe()
,
Вот PublishSubject, который делает примерно то же самое:
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);
Вы бы отписались от него так же, позвонив subscription.unsubscribe()
,
Все Subjects
простираться Observable
на который вы можете подписаться, используя любой из нескольких subscribe(...)
методы. Звоните на любой из subscribe(...)
методы возвращают Subscription
,
Subscription subscription = anySubject.subscribe(...);
Использовать этот subscription
экземпляра unsubscribe()
метод, когда вы хотите прекратить прослушивание событий от субъекта.
subscription.unsubscribe();