如何取消订阅PublishSubject和BehaviorSubject?

时间:2014-01-21 12:13:16

标签: java rx-java subject-observer

subjects包下,您有PublishSubjectBehaviorSubject等类,我认为可以将其描述为一些可用的样本Observables

如何取消订阅这些科目?没有unsubscribe方法,调用onCompleted完全结束了Observable吗?

3 个答案:

答案 0 :(得分:68)

主题同时是ObservableObserver,可以像普通的观察者一样取消订阅。使主题变得特别的是它是可观察者和观察者之间的桥梁。它可以通过重新发送它来传递它观察到的物品,它也可以发出新物品。由于承诺是期货,所以主题是可观察的。

这里是受试者家庭的简要描述:

AsyncSubject :仅发出源Observable的最后一个值

BehaviorSubject :当观察者订阅时,会发出最近发出的项目以及源Observable的所有后续项目

PublishSubject :在订阅时发出源Observable的所有后续项目

ReplaySubject :无论订阅者何时订阅,都会发出源Observable的所有项目。

official doc带有一些漂亮的大理石图表,使其更容易理解

答案 1 :(得分:24)

主题基本上是两个 Observables和Observers。

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()以相同的方式取消订阅。

答案 2 :(得分:5)

所有Subjects扩展Observable您可以使用多种subscribe(...)方法中的任何一种订阅。调用任何subscribe(...)方法都会返回Subscription

Subscription subscription = anySubject.subscribe(...);

当您想要停止收听主题中的事件时,请使用此subscription实例的unsubscribe()方法。

subscription.unsubscribe();