本文介紹 RxJava 的操作符含義及使用方法,持續補充中。
具體代碼示例可見:https://github.com/Gdeeer/GdTestHub
RxJava 官網:http://reactivex.io/documentation/operators.html
文章目錄
一、創建操作符
- Just
- 發佈幾個指定的產品
- Range
- 發佈一串連續的整數
- From
- 發送一個序列的元素
- FromArray
- FromIterable
- FromFuture
- FromCallable
- 發送一個序列的元素
- Create
- 需要用戶手動調用 onNext() 來發布產品
- Timer
- 在一段時間後發佈一個 0L
- Inteval
- 以固定的間隔發佈從0開始的一串連續整數(默認在間隔後纔開始發佈,指定 initialDelay 爲 0 則立即開始)
- IntervalRange
- 以固定的間隔發佈指定頭尾的一串連續整數
- Repeat
- 把上游的發佈過程重複n遍,(有過程後才能重複,即要用在生產出 Observable 後才能使用 Repeat;過程完了之後才能重複)
- 上游發佈 1,2,3,重複2遍就是 1,2,3,1,2,3
- Defer
- 發佈的產品是 Observable,即被 subscribe 後,才創建真正的 Obserable
- Empty
- 不發佈產品,直接宣告結束
- Never
- 不發佈產品,不宣告結束
二、轉換操作符
- Buffer
- 把上游發佈的產品收集後分批發布(一批滿了才一起發佈)
- 上游發佈 1,2,3,4
- 2個一批,發佈【1,2】,【3,4】
- Map
- 把上游的產品轉換爲另一種產品,一個A轉換爲一個B,一對一
- FlatMap
- 更像是 MapFlat
- 把上游的產品轉換爲另一種產品,一個A轉換爲多個B,一對多
- GroupBy
- 把上游的產品按某個標準分組,下游拿到的產品是 Observable,需要再 subscribe 後才能發佈(按時間線依次發佈)
- 上游發佈 1,2,3,4
- 按奇偶,由兩個 Observable 分別發佈 【1,3】,【2,4】
- Scan
- 可以對上游的產品進行疊加操作(如累加、累乘),再依次發佈出去
- 上游發佈 1,2,3,4
- 累加發布 1,3,6,10
- Window
- 把上游的產品分批,每批由不同的 Observable 發佈(按時間線依次發佈)
- 上游發佈 1,2,3,4
- 2個一批,由兩個 Observable 分別發佈 【1,2】,【3,4】
三、過濾操作符
- Debounce
- 收到上游的產品,一段時間內沒有收到其他產品,才把這個產品發佈出去
- 上游每隔 1s 發佈 1,2,3,4
- Debounce 2s,則只有 4 被髮布到下游
- Distinct
- 去重
- ElementAt
- 按 index 取值
- Filter
- 按某種條件過濾
- First
- 第一個
- IgnoreElements
- 忽略產品,只發布結束信號
- Last
- 最後一個
- Sample
- 取樣,發佈指定間隔內,上游發佈的最後一個產品(沒有則不發佈)
- Skip
- 跳過幾個產品,或跳過一段時間
- SkipLast
- 跳過最後的幾個產品,或跳過最後的一段時間(實際上是相當於延遲發佈)
- Take
- 只取前面的幾個
- TakeLast
- 只取最後的幾個
四、合併操作符
把多個 Observable 合併爲一個
- CombineLast
- 靜態方法
- 合併多個 Observable,任一 Observable 發佈產品時,將這個產品跟其他 Observable 的最新產品一起處理後發佈
- 當所有 Observable 都有產品發佈後纔開始一起處理、發佈
- 挺繞的,看看官網的圖吧
- Join
- 合併兩個 Observable:left、right,left.join(right),任何一個發佈產品時,將這個產品和它所處 window 區間所屬的產品合併後發佈
- 每個產品會有一個屬於自己的 window
- 每個產品可能處於多個 window 區間內
- window 的開啓:left、right 中有產品發佈,就會開啓一個該產品對應的 window
- window 的關閉:產品對應 window 的關閉由它的 leftEnd、rightEnd 兩個 Observable 決定,leftEnd、rightEnd 發佈一個產品或宣佈結束,就會關閉它的 window
- 很繞,看看官網的圖和demo吧(可用於生成其他的操作符)
- Merge
- 靜態方法
- 合併多個 Observable,用一個 Observable 來統一發布它們的產品(不做干預,只是發佈)
- StartWith
- 在上游發佈前先發布幾個產品
- SwitchOnNext
- 靜態方法
- 處理一個髮布子 Observable 的源 Observable,源 Observable 每發佈一個新的子 Observable,則開始對外發布這個子 Observable 的產品
- 同時取消對之前的子 Observable 的訂閱
- Zip
- 靜態方法
- 合併多個 Observable,全部 Observable 一起推進,全都有產品發佈時纔開始一起處理,對外發布
五、錯誤處理操作符
- Retry
- onError 之後重新 subscribe n 次
六、Observable 工具操作符
- Delay
- 收到上游的產品後,延遲一段時間,纔開始發佈
- DoOn…
- 監聽 Observable 的生命週期回調
- Materialize
- 把 onNext、onComplete、onError 都包裝爲 Notification 發佈出去
- DeMaterialize
- 把 Notification 解包裝爲 onNext、onComplete、onError
- ObserveOn
- 指定 Observer 接收產品的線程
- SubscribeOn
- 指定 subscribe 發生的線程,即源 Observable 生產產品的線程
- TimeInterval
- 發佈一個 Timed 產品,它包裝了原產品和該產品距離上一個產品發佈的時間間隔
- Timeout
- 設置產品的發佈間隔,超時後發出 onError
- Timestamp
- 發佈一個 Timed 產品,它包裝了原產品和該產品的發佈時間
- Using
- 靜態方法
- 接受三個方法,一個 Resource 工廠,一個 Observable 工廠,一個 Resource 的 dispose 方法
- Resource 是 Observable 會用到的資源,和 Observable 的存活時間相同,在 Observable terminate 時會 dispose 這個 Resource
- 類似一個 try/finally,在 dispose 方法中做回收工作
七、條件和布爾操作符
- All
- 是否所有產品都滿足某個條件
- Amb
- 靜態方法
- 接受一個 Observable 序列,只發布其中最早發送產品或通知的 Observable 的產品
- Contains
- 上游的產品中是否包含某個特定產品
- DefaultIfEmpty
- 如果上游的 Observable 爲空,則發佈一個默認產品
- SequenceEqual
- 靜態方法
- 判斷兩個 Observable 發佈的產品序列是否相同(一一對應)
- SkipUtil
- 跳過上游的產品,直到第二個 Observable 開始發佈;隨後都正常發佈
- SkipWhile
- 跳過上游的產品,直到產品不滿足某個條件;隨後都正常發佈
- TakeUntil
- 發佈上游的產品,直到第二個 Observable 開始發佈,或產品滿足了某個條件;隨後不再發布
- TakeWhile
- 發佈上游的產品,直到產品不滿足某個條件;隨後不再發布
八、數學和聚合操作符
需要引入 rxjava2-extensions 庫,implementation ‘com.github.akarnokd:rxjava2-extensions:0.20.10’,來自 mavenCentral()。
使用 MathFlowable、MathObsevable
- Average
- 靜態方法
- 產品的平均值
- Concat
- 依次發佈若干個 Observable
- Count
- 產品的總數
- Max
- 靜態方法
- 產品的最大值
- Min
- 靜態方法
- 產品的最小值
- Reduce
- 可以對上游的產品進行疊加操作(如累加、累乘),再將最終結果發佈出去
- 與 scan 很類似
- 上游發佈 1,2,3,4
- 累加發布 10
- Sum
- 靜態方法
- 產品的累加值
九、可連接 Observable 操作符
- Publish
- 把一個普通 Observable 轉換爲可連接 Observable
- 可連接的 Observable:
- 在 connect 後開始發佈
- 一次 connect 只會發佈一次,不管期間有沒有 Observer、Observer 在何時 subscribe
- 一次 connect 後不能再次 connect
- 一次 disConnect 後可以再次 connect
- 再次 connect 後會重頭開始發佈
- disConnect:
- 調用 connect 的 dispose,或自然結束
- Connect
- 見 Publish
- RefCount
- 使一個可連接 Observable 的行爲與普通 Observable 一致
- 在第一個 Observer subscribe 時自動 connect
- 在最後一個 Observer unSubscribe 時自動 disConnect
- Replay
- 把一個普通 Observable 轉換爲特殊的可連接 Observable
- connect 後,對每個 Observer 都發送相同的產品序列,如果它 subscribe 得晚的話,把錯過的先補給它
十、其他
- To
- 轉化 Obserable 到其他結構
- ToList
- ToSortedList
- ToMap