目錄
【RxJava】- 創(chuàng)建操作符源碼分析
【RxJava】- 變換操作符源碼分析
【RxJava】- 結(jié)合操作符源碼分析
【RxJava】- 連接操作符源碼分析
Debounce
僅在過了一段指定的時間還沒發(fā)射數(shù)據(jù)時才發(fā)射一個數(shù)據(jù)舀武。由類
ObservableDebounce
ObservableDebounceTimed
實現(xiàn)。
ObservableDebounce
被觀察者發(fā)射數(shù)據(jù)瘪匿,調(diào)用DebounceObserver的onNext方法寻馏。首先獲取上一次發(fā)射數(shù)據(jù)時保存的DebounceInnerObserver(一個跳轉(zhuǎn)中轉(zhuǎn)類)實例,如果不為null诚欠,者先取消上一次的發(fā)射任務,再進行下一數(shù)據(jù)的發(fā)射粉寞。
調(diào)用debounce傳入的數(shù)據(jù)包裝實例,然后拿到包裝后的數(shù)據(jù)進行發(fā)射仁锯。
所以如果數(shù)據(jù)發(fā)射過快翔悠,那么部分數(shù)據(jù)可能就會丟失。
ObservableDebounceTimed
發(fā)射數(shù)據(jù)是蓄愁,創(chuàng)建一個延時發(fā)射器,當延時時間到達時妇斤,調(diào)用延時發(fā)射器run方法丹拯。將發(fā)射任務交給被包裝的觀察者對象SerializedObserver實例。調(diào)用SerializedObserver實例的onNext方法發(fā)射數(shù)據(jù)乖酬。
-
SerializedObserver
如果上一個延遲時間沒有到,新的數(shù)據(jù)發(fā)射到達時咬像,將取消上一次的延遲計劃生宛,開始新的延時計劃肮柜。如果上一個發(fā)射還沒有完成,處于發(fā)射中莱睁,那么新的數(shù)據(jù)被存放在一個數(shù)組中芒澜,等下一次滿足發(fā)射條件仰剿,然后循環(huán)發(fā)射所以數(shù)據(jù)。
Distinct
過濾掉重復的數(shù)據(jù)項酥馍。由
ObservableDistinct
ObservableDistinctUntilChanged
ObservableDistinct
key = Objects.requireNonNull(keySelector.apply(value), "The keySelector returned a null key");
b = collection.add(key);
得到數(shù)據(jù)阅酪,添加到集合(默認是HashSet),如果添加成功這發(fā)射數(shù)據(jù)术辐,否則不發(fā)生,這樣就可以過濾掉重復的數(shù)據(jù)項必孤。
ObservableDistinctUntilChanged
ObservableDistinctUntilChanged實現(xiàn)很簡單瑞躺,在發(fā)射數(shù)據(jù)時,先檢測是否已經(jīng)發(fā)射過數(shù)據(jù)幢哨,如果已經(jīng)發(fā)射過,就和上一個值進行比較捞镰,如果不相同就發(fā)射新的數(shù)據(jù)。
ElementAt
只發(fā)射第N項數(shù)據(jù)践樱。由
ObservableElementAtMaybe
ObservableElementAtSingle
實現(xiàn)凸丸。
ObservableElementAtMaybe
實現(xiàn)很簡單,自己查看甲雅,發(fā)射第N項數(shù)據(jù)坑填。
ObservableElementAtSingle
功能和ObservableElementAtMaybe差不多弛姜。
Filter
按照一定規(guī)則過濾妖枚。由
ObservableFilter
實現(xiàn)
代碼實現(xiàn)很簡單,調(diào)用傳入的過濾實例的test方法绝页,如果返回true者發(fā)射數(shù)據(jù),否則不發(fā)射莱没。
First
只發(fā)射第一項(或者滿足某個條件的第一項)數(shù)據(jù)酷鸦,由
ObservableElementAtSingle
實現(xiàn)。
這個上面已經(jīng)分析過了臼隔。
IgnoreElements
不發(fā)射任何數(shù)據(jù),只發(fā)射Observable的終止通知寄狼,由
ObservableIgnoreElementsCompletable
實現(xiàn)氨淌。自己看源碼泊愧,onNext中沒有任何實現(xiàn)盛正。
Last
只發(fā)射最后一項(或者滿足某個條件的最后一項)數(shù)據(jù)。由
ObservableLastMaybe
ObservableLastSingle
實現(xiàn)腋腮。在調(diào)用onComplete時壤蚜,發(fā)射最后一項數(shù)據(jù)。
Sample
定期發(fā)射Observable最近發(fā)射的數(shù)據(jù)項袜刷,由
ObservableSampleTimed
ObservableSampleWithObservable
ObservableSampleTimed
開始一個延時任務,當延時時間到達時墩蔓,執(zhí)行數(shù)據(jù)發(fā)射,具體自己看源碼奸披,很簡單。
ObservableSampleWithObservable
不同的邏輯在SerializedObserver中阵面,這個已經(jīng)在上面講解過了。
Skip
抑制Observable發(fā)射的前N項數(shù)據(jù)仑扑,由
ObservableSkip
ObservableSkipUntil
ObservableSkipWhile
實現(xiàn)置鼻。
ObservableSkip
if (remaining != 0L) {
remaining--;
} else {
downstream.onNext(t);
}
很簡單,自己查看源碼箕母。
ObservableSkipUntil
@Override
public void subscribeActual(Observer<? super T> child) {
...
other.subscribe(new SkipUntil(frc, sus, serial));
source.subscribe(sus);
}
直到SkipUntil發(fā)射數(shù)據(jù),才發(fā)射后面的數(shù)據(jù)邑茄,具體自己查看源碼俊啼。
ObservableSkipWhile
public void onNext(T t) {
if (notSkipping) {
downstream.onNext(t);
} else {
boolean b;
...
b = predicate.test(t);
...
if (!b) {
notSkipping = true;
downstream.onNext(t);
}
}
}
跳過滿足條件的數(shù)據(jù)項。
SkipLast
抑制Observable發(fā)射的后N項數(shù)據(jù),由
ObservableSkipLast
ObservableSkipLastTimed
實現(xiàn)授帕。
ObservableSkipLastTimed
if (!empty && ts > now - time) {
empty = true;
}
if (empty) {
break;
}
發(fā)射數(shù)據(jù)是存在數(shù)組中的當時的時間,time我們傳入的間隔時間彤路,只要在now - time發(fā)射的數(shù)據(jù)都會被拋棄芥映。
Take
只發(fā)射前面的N項數(shù)據(jù),使用Take操作符讓你可以修改Observable的行為奈偏,只返回前面的N項數(shù)據(jù),然后發(fā)射完成通知丽涩,忽略剩余的數(shù)據(jù)。具體可以結(jié)合上面的內(nèi)容矢渊,里面很多和上面的類似,這里就不一一看源碼了矮男。
TakeLast
發(fā)射Observable發(fā)射的最后N項數(shù)據(jù),使用TakeLast操作符修改原始Observable避凝,你可以只發(fā)射Observable’發(fā)射的后N項數(shù)據(jù)眨补,忽略前面的數(shù)據(jù)倒脓。
總結(jié)
其實過濾操作符大多實現(xiàn)都很簡單,自己畫幾分鐘就能看懂崎弃。