Как отменить подписку на 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();
Другие вопросы по тегам