Подтвердить что ты не робот

Как можно отменить подписку PublishSubject и BehaviorSubject?

В пакете subjects у вас есть классы типа PublishSubject и BehaviorSubject, которые, как я полагаю, можно охарактеризовать как пример использования Observables.

Как эти субъекты могут быть отписаны? Нет метода unsubscribe, и вызов onCompleted полностью закрывает Observable?

4b9b3361

Ответ 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();