這篇文章將圍繞RxJava中的Subject來展開。
- Publish Subject
- Replay Subject
- Behavior Subject
- Async Subject
何謂Subject?
Subject是RxJava中實現既能扮演觀察者(Observer)又能作為Observable的一種橋梁或者代理。因其為一個觀察者,它可以訂閱一個或多個Observable,又因其為一個Observable,他可以重新發射它觀察到的值,也可以發射一些新的值。
我相信:通過例子來學習是最好的方法。
Observable: 假定教授是一個Observable,教授講解一些課題。
Observer: 假定學生是一個Observer,學生聽教授正在講解的課題。
Publish Subject
它發射源Observable被訂閱之后的所有值。
如果一個學生上課遲到啦,他只想聽到他進入教室后的內容。此時Publish是最適合這個場景。
來看看下面的例子:
PublishSubject<Integer> source = PublishSubject.create();
// 1, 2, 3, 4 and onComplete
source.subscribe(getFirstObserver());
source.onNext(1);
source.onNext(2);
source.onNext(3);
// It will get 4 and onComplete for second observer also.
source.subscribe(getSecondObserver());
source.onNext(4);
source.onComplete();
Replay Subject
它發射源Observable的所有值,無論訂閱者何時訂閱。
如果一個學生遲到啦,他想從頭聽起。此時我們可以使用Replay來實現。
例子如下:
ReplaySubject<Integer> source = ReplaySubject.create();
// It will get 1, 2, 3, 4
source.subscribe(getFirstObserver());
source.onNext(1);
source.onNext(2);
source.onNext(3);
source.onNext(4);
source.onComplete();
// It will also get 1, 2, 3, 4 as we have used replay Subject
source.subscribe(getSecondObserver());
Behavior Subject
當觀察者訂閱時,它發射源Observable最近一次以及后續的所有值。
比如,一個學生遲到啦,他想聽老師最近講解的內容(不是從頭開始),以了解上下文。所以此時我們會使用Behavior
代碼如下:
BehaviorSubject<Integer> source = BehaviorSubject.create();
// It will get 1, 2, 3, 4 and onComplete
source.subscribe(getFirstObserver());
source.onNext(1);
source.onNext(2);
source.onNext(3);
// It will get 3(last emitted)and 4(subsequent item) and onComplete
source.subscribe(getSecondObserver());
source.onNext(4);
source.onComplete();
Async Subject
它只發射源Observable的最后一個值,之后Observable便結束啦。
如果一個學生在任何一個時刻進入教室,而且他只想他聽到教授講解的最后一個內容,之后變下課啦。此時我們會使用Async.
代碼如下:
AsyncSubject<Integer> source = AsyncSubject.create();
// It will get only 4 and onComplete
source.subscribe(getFirstObserver());
source.onNext(1);
source.onNext(2);
source.onNext(3);
// It will also get only get 4 and onComplete
source.subscribe(getSecondObserver());
source.onNext(4);
source.onComplete();
翻譯自:Understanding RxJava Subject?—?Publish, Replay, Behavior and Async Subject