在subjects
包下,您有PublishSubject
和BehaviorSubject
等类,我认为可以将其描述为一些可用的样本Observables
。
如何取消订阅这些科目?没有unsubscribe
方法,调用onCompleted
完全结束了Observable吗?
答案 0 :(得分:68)
主题同时是Observable
和Observer
,可以像普通的观察者一样取消订阅。使主题变得特别的是它是可观察者和观察者之间的桥梁。它可以通过重新发送它来传递它观察到的物品,它也可以发出新物品。由于承诺是期货,所以主题是可观察的。
这里是受试者家庭的简要描述:
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();