如何取消订阅发布主题和行为主题?

2022-09-01 03:29:17

在包下,您有这样的类,我想可以将其描述为一些可用的示例。subjectsPublishSubjectBehaviorSubjectObservables

如何取消订阅这些主题?没有方法和调用完全结束可观察性对吧?unsubscribeonCompleted


答案 1

A 是一个和一个,同时,它可以像普通可观察量一样取消订阅。主题的特别之处在于它是可观察量和观察者之间的桥梁。它可以通过释放它所观察到的项目来传递它们,也可以发出新的项目。主题是可观察的,就像承诺是期货的主题一样。SubjectObservableObserver

以下是受试者系列的简要说明:

异步主体:仅发出源可观察对象的最后一个值

行为主体:当观察者订阅源可观察时,发出最近发出的项以及源可观察的所有后续项。

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

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

官方文档附带了一些漂亮的大理石图表,使其更容易理解


答案 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,它执行大致相同的操作:

    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()


推荐