在subjects
包下,您有类似的类PublishSubject
,BehaviorSubject
我想可以将其描述为一些可用的示例Observables
。
如何退订这些主题?没有unsubscribe
方法并且调用onCompleted
完全结束了 Observable 对吗?
在subjects
包下,您有类似的类PublishSubject
,BehaviorSubject
我想可以将其描述为一些可用的示例Observables
。
如何退订这些主题?没有unsubscribe
方法并且调用onCompleted
完全结束了 Observable 对吗?
ASubject
同时是 anObservable
和 an Observer
,它可以像普通的 observable 一样被取消订阅。主题的特别之处在于它是可观察者和观察者之间的桥梁。它可以通过重新发射它观察到的项目来传递它们,也可以发射新的项目。主题是可观察的,就像承诺是期货一样。
以下是主题家庭的简要说明:
AsyncSubject:只发出源 Observable 的最后一个值
BehaviorSubject:当观察者订阅源 Observable 时,发出最近发出的项目和所有后续项目。
PublishSubject:在订阅时发出源 Observable 的所有后续项。
ReplaySubject:无论订阅者何时订阅,都会发出源 Observable 的所有项目。
官方文档附带了一些漂亮的大理石图,使其更容易理解
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()
。
您可以使用多种方法中的任何一种订阅的所有Subjects
扩展。调用任何方法都会返回一个.Observable
subscribe(...)
subscribe(...)
Subscription
Subscription subscription = anySubject.subscribe(...);
当您想停止侦听来自主题的事件时,请使用此subscription
实例的方法。unsubscribe()
subscription.unsubscribe();