Как можно отменить подписку PublishSubject и BehaviorSubject?
В пакете subjects
у вас есть классы типа PublishSubject
и BehaviorSubject
, которые, как я полагаю, можно охарактеризовать как пример использования Observables
.
Как эти субъекты могут быть отписаны? Нет метода unsubscribe
, и вызов onCompleted
полностью закрывает Observable?
Ответы
Ответ 1
A Subject - это Observable
и Observer
в то же время, он может быть отписано от обычных наблюдаемых. то, что делает предметом особой, является то, что это своего рода мост между наблюдаемыми и наблюдателями. он может пройти через предметы, которые он наблюдает, переиздавая их, и он также может испускать новые предметы. предметы относятся к наблюдаемым, поскольку promises относятся к фьючерсам.
вот краткое описание семейства предметов:
AsyncSubject: только испускает последнее значение источника Observable
BehaviorSubject: испускает последний испущенный элемент и все последующие элементы источника. Наблюдается, когда наблюдатель подписывается на него
PublishSubject: испускает все последующие элементы источника. Наблюдается во время подписки
ReplaySubject: испускает все элементы источника Наблюдаемые, независимо от того, когда абонент подписывается.
официальный документ поставляется с красивыми мраморными диаграммами, что облегчает понимание
Ответ 2
Субъекты по существу являются как наблюдателями, так и наблюдателями.
Наблюдаемое - это, по сути, вещь, которая имеет функцию, которая берет Наблюдателя и возвращает подписку. Так, например, при простом наблюдении:
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<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()
.
Ответ 3
Все Subjects
expand Observable
, которые вы можете подписаться на использование любого из нескольких методов subscribe(...)
. Вызов любого из методов subscribe(...)
возвращает a Subscription
.
Subscription subscription = anySubject.subscribe(...);
Используйте этот метод Subscription
instance unsubscribe()
, когда вы хотите прекратить прослушивание событий из темы.
subscription.unsubscribe();