根據subjects
包你有類似PublishSubject
和BehaviorSubject
我想可以被描述爲一些可用的樣品Observables
。PublishSubject和BehaviorSubject如何取消訂閱?
這些問題如何才能退訂?沒有unsubscribe
方法,並呼籲onCompleted
結束可觀測完全正確的?
根據subjects
包你有類似PublishSubject
和BehaviorSubject
我想可以被描述爲一些可用的樣品Observables
。PublishSubject和BehaviorSubject如何取消訂閱?
這些問題如何才能退訂?沒有unsubscribe
方法,並呼籲onCompleted
結束可觀測完全正確的?
一個主題是Observable
和Observer
在同一時間,它可以像正常觀測值一樣取消訂閱。使學科特別的是它是可觀察者和觀察者之間的橋樑。它可以通過重新發送它們來通過它觀察到的項目,並且它還可以發出新的項目。如果對未來承諾的話,對象應該是可觀察的。
這裏是主題系列的簡短描述:
AsyncSubject:只發射源可觀察
BehaviorSubject的最後一個值:發射最近發射的項目,所有的後續項目源觀察者訂閱它時可觀察
發佈主題:發出源Observable的所有後續項目在訂閱時
ReplaySubject:發出源Observable的所有項目,而不管訂戶何時訂閱。
的official doc提供了一些好的大理石圖這使得它更容易理解
主題基本上是都觀測量和觀察員。
可觀察到的基本上是有一個函數,觀察員和返回訂閱的事情。因此,例如,給出簡單的觀察到:
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();
}
});
在這裏,我們將訂閱它,打印出一條線的各整數:通過調用sub.unsubscribe()
Subscription sub = observable.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println(integer);
}
});
您將取消上述。
這裏是一個PublishSubject,做大致相同的事情:通過調用subscription.unsubscribe()
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);
你會退訂用同樣的方式。
請問您能介紹一下我們如何讓訂戶在並行處理onNext?如果有幾個訂閱者,而不僅僅是一個,我們如何讓它們並行執行 – vach
@vach - 根據上面的代碼,您可以通過執行類似下面的操作,使訂閱者在onNext上並行處理: 'Subscription subscription1 = publishSubject.observeOn(Schedulers .newThread())。subscribe(...);' and 'Subscription subscription2 = publishSubject.observeOn(Schedulers.newThread())。subscribe(...);' –
我總是想知道如何做到這一點,我直到現在還沒有明白,thx @ praveer09 :) –
所有Subjects
延長Observable
您可以訂閱使用任何倍數subscribe(...)
方法。呼籲任何subscribe(...)
方法返回一個Subscription
。
Subscription subscription = anySubject.subscribe(...);
使用,當你想停止收聽來自受試者的事件,此subscription
實例的unsubscribe()
方法。
subscription.unsubscribe();
BehaviorSubject與ReplaySubject(1)基本相同嗎? –
@DzmitryLazerka:BehaviorSubject始終有一個初始值。如果您正在查找沒有初始值的BehaviorSubject,則使用ReplaySubject(1)。 – gregschlom
雖然稍作修改很好的回答--ReplaySubject也可以在create()中指定緩衝區,這將是訂閱時發出的項目數量 – jklp