39

subjects包下,您有类似的类PublishSubjectBehaviorSubject我想可以将其描述为一些可用的示例Observables

如何退订这些主题?没有unsubscribe方法并且调用onCompleted完全结束了 Observable 对吗?

4

3 回答 3

72

ASubject同时是 anObservable和 an Observer,它可以像普通的 observable 一样被取消订阅。主题的特别之处在于它是可观察者和观察者之间的桥梁。它可以通过重新发射它观察到的项目来传递它们,也可以发射新的项目。主题是可观察的,就像承诺是期货一样。

以下是主题家庭的简要说明:

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

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

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

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

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

于 2014-01-24T05:33:14.957 回答
30

Subjects 本质上是Observables和 Observers。

Observable 本质上是一个具有接受 Observer 并返回订阅的函数的东西。因此,例如,给定简单的 observable:

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

于 2014-01-24T02:44:00.197 回答
6

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

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

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

subscription.unsubscribe();
于 2015-11-07T07:25:43.037 回答