在rxjava中,subject是即可作為觀察者形帮,也可以作為被觀察者 。顧名思義
- subject作為被觀察者(observable)
即可作為observable向其他observable發(fā)送時間 - subject作為觀察者(observer)
即可作為observer接收其他observable發(fā)送的事件
一、observable的subject
看官方網(wǎng)文檔铡原,可以發(fā)現(xiàn)subject作為observable的時候主要有四個子類沈跨,分別是PublishSubject由捎、BehaviorSubject、ReplaySubject饿凛、AsyncSubject狞玛。
-
PublishSubject
最常見的subject软驰,當觀察者訂閱該subject,它會按照順序發(fā)送事件給訂閱的觀察者心肪。不會因為事件改變而改變順序
-
BehaviorSubject
該類有創(chuàng)建時需要一個默認參數(shù)。并且在發(fā)送的時候會先發(fā)送離訂閱最近的一個值,如果沒有值的話就是用這個默認值歪赢,參考一下代碼(參考):
// 訂閱之前酷勺,最近一個值為空,這里將發(fā)送默認值“default”給觀察者
BehaviorSubject<Object> subject = BehaviorSubject.create("default");
subject.subscribe(observer);
subject.onNext("one");
subject.onNext("two");
subject.onNext("three");
// 訂閱之前固该,最近一個值為“zero”锅减,會先發(fā)送zero.因此觀察者會接收到“one”、“two”伐坏、“three”
BehaviorSubject<Object> subject = BehaviorSubject.create("default");
subject.onNext("zero");
subject.onNext("one");
subject.subscribe(observer);
subject.onNext("two");
subject.onNext("three");
// 觀察者只能接收到onCompleted
BehaviorSubject<Object> subject = BehaviorSubject.create("default");
subject.onNext("zero");
subject.onNext("one");
subject.onCompleted();
subject.subscribe(observer);
// 觀察者只能接收到onError
BehaviorSubject<Object> subject = BehaviorSubject.create("default");
subject.onNext("zero");
subject.onNext("one");
subject.onError(new RuntimeException("error"));
subject.subscribe(observer);
-
ReplaySubject
該subject既有緩存事件怔匣,也就是當被一個觀察者所訂閱的時候,事件不會直接被消化桦沉。下個觀察者訂閱的時候可以再次接收到事件每瞒。
ReplaySubject<Object> subject = ReplaySubject.create();
subject.onNext("one");
subject.onNext("two");
subject.onNext("three");
subject.onCompleted();
// 兩個觀察者都會接收到事件
subject.subscribe(observer1);
subject.subscribe(observer2);
-
AsyncSubject
該subject只有在被觀察者(subject)結(jié)束的時候(即執(zhí)行了onCompleted)后觀察者才能夠接收到事件,并且也只有能接收到最后一個事件永部。
// 觀察者不會接收到任何數(shù)據(jù)独泞,因為subject沒有結(jié)束(onCompleted)
AsyncSubject<Object> subject = AsyncSubject.create();
subject.subscribe(observer);
subject.onNext("one");
subject.onNext("two");
subject.onNext("three");
// 觀察者只能接收到最后一件事件,即three事件
AsyncSubject<Object> subject = AsyncSubject.create();
subject.subscribe(observer);
subject.onNext("one");
subject.onNext("two");
subject.onNext("three");
subject.onCompleted();
二苔埋、observer的subject
這個日常應該會遇到的比較少懦砂,原理是subject訂閱被觀察者的時候,當被觀察者發(fā)送事件到subject后组橄,會發(fā)送到subject中注冊的observer中荞膘。