RxJava

Subscriber和Observer的差異

SubscriberObserver不只基本使用方式同樣。實質上,在 RxJavasubscribe 過程當中。Observer 也老是會先被轉換成一個 Subscriber 再使用。因此假設你僅僅想使用基本功能。選擇 ObserverSubscriber 是全然同樣的。它們的差異對於使用者來講主要有兩點:android

  1. onStart(): 這是 Subscriber 添加的方法。它會在 subscribe 剛開始。而事件還未發送以前被調用。可以用於作一些準備工做。好比數據的清零或重置。

    這是一個可選方法,默認狀況下它的實現爲空。數組

    需要注意的是,假設對準備工做的線程有要求(好比彈出一個顯示運行進度的對話框。這必須在主線程運行)。 onStart() 就不適用了,因爲它老是在 subscribe 所發生的線程被調用,而不能指定線程。要在指定的線程來作準備工做。可以使用 doOnSubscribe() 方法。詳細可以在後面的文中看到。緩存

  2. unsubscribe(): 這是 Subscriber 所實現的還有一個接口 Subscription 的方法,用於取消訂閱。在這種方法被調用後,Subscriber 將再也不接收事件。通常在這種方法調用前。可以使用 isUnsubscribed() 先推斷一下狀態。 unsubscribe() 這種方法很是重要,因爲在 subscribe() 以後, Observable 會持有 Subscriber 的引用。這個引用假設不能及時被釋放。將有內存泄露的風險。

    因此最好保持一個原則:要在再也不使用的時候儘快在合適的地方(好比 onPause() onStop() 等方法中)調用 unsubscribe() 來解除引用關係,以免內存泄露的發生。markdown

變換

RxJava 提供了對事件序列進行變換的支持,這是它的核心功能之中的一個,也是大多數人說『RxJava 真是太好用了』的最大緣由。所謂變換。就是將事件序列中的對象或整個序列進行加工處理。轉換成不一樣的事件或事件序列。數據結構

操做符

事實上操做符就是爲了提供一些函數式的特性。函數式最大的優勢就是處理數據簡潔易懂。併發

map就是至關於對每一個元素進行變換,返回變換後的集合
filter就是對集合進行過濾
each就是遍歷集合
take取出集合中的前幾個
skip跳過前幾個元素
unique至關於依照數學上的集合處理,去重app

事實上我認爲題主認爲最難理解的應該是flatMap和Observable的概念吧。函數

Observable可以理解成lazy load的集合。post

flatMap想當於對lazyLoad的集合中的每一個元素再進行一次lazy load。學習

(此段引用自hi大頭鬼hi

變換操做

這些操做符可用於對Observable發射的數據進行變換,詳解可以看每一個操做符的文檔

操做符 含義
Buffer 緩存,可以簡單的理解爲緩存。它按期從Observable收集數據到一個集合,而後把這些數據集合打包發射,而不是一次發射一個
FlatMap 扁平映射,將Observable發射的數據變換爲Observables集合。而後將這些Observable發射的數據平坦化的放進一個單獨的Observable。可以認爲是一個將嵌套的數據結構展開的過程。
GroupBy 分組,將原來的Observable分拆爲Observable集合。將原始Observable發射的數據按Key分組。每一個Observable發射一組不一樣的數據
Map 映射,經過對序列的每一項都應用一個函數變換Observable發射的數據。實質是對序列中的每一項運行一個函數,函數的參數就是這個數據項
Scan 掃描。對Observable發射的每一項數據應用一個函數,而後按順序依次發射這些值
Window 窗體,按期未來自Observable的數據分拆成一些Observable窗體,而後發射這些窗體。而不是每次發射一項。類似於Buffer,但Buffer發射的是數據,Window發射的是Observable,每一個Observable發射原始Observable的數據的一個子集

組合操做

組合操做符用於將多個Observable組合成一個單一的Observable

操做符 含義
And/Then/When 經過模式(And條件)和計劃(Then次序)組合兩個或多個Observable發射的數據集
CombineLatest 當兩個Observables中的不論什麼一個發射了一個數據時。經過一個指定的函數組合每一個Observable發射的最新數據(一共兩個數據)。而後發射這個函數的結果
Join 無論什麼時候,假設一個Observable發射了一個數據項。僅僅要在還有一個Observable發射的數據項定義的時間窗體內,就將兩個Observable發射的數據合併發射
Merge 將兩個Observable發射的數據組合併成一個
StartWith 在發射原來的Observable的數據序列以前。先發射一個指定的數據序列或數據項
Switch 將一個發射Observable序列的Observable轉換爲這樣一個Observable:它逐個發射那些Observable近期發射的數據
Zip 打包,使用一個指定的函數將多個Observable發射的數據組合在一塊兒,而後將這個函數的結果做爲單項數據發射

錯誤處理

這些操做符用於從錯誤通知中恢復

操做符 含義
Catch 捕獲。繼續序列操做,將錯誤替換爲正常的數據,從onError通知中恢復
Retry 重試,假設Observable發射了一個錯誤通知。又一次訂閱它。期待它正常終止

輔助操做

一組用於處理Observable的操做符

操做符 含義
Delay 延遲一段時間發射結果數據
Do 註冊一個動做佔用一些Observable的生命週期事件,至關於Mock某個操做
Materialize/Dematerialize 將發射的數據和通知都當作數據發射,或者反過來
ObserveOn 指定觀察者觀察Observable的調度程序(工做線程)
Serialize 強制Observable按次序發射數據並且功能是有效的
Subscribe 收到Observable發射的數據和通知後運行的操做
SubscribeOn 指定Observable應該在哪一個調度程序上運行
TimeInterval 將一個Observable轉換爲發射兩個數據之間所耗費時間的Observable
Timeout 加入超時機制。假設過了指定的一段時間沒有發射數據,就發射一個錯誤通知
Timestamp 給Observable發射的每一個數據項加入一個時間戳
Using 建立一個僅僅在Observable的生命週期內存在的一次性資源

條件和布爾操做

這些操做符可用於單個或多個數據項,也可用於Observable

操做符 含義
All 推斷Observable發射的所有的數據項是否都知足某個條件
Amb 給定多個Observable,僅僅讓第一個發射數據的Observable發射所有數據
Contains 推斷Observable是否會發射一個指定的數據項
DefaultIfEmpty 發射來自原始Observable的數據,假設原始Observable沒有發射數據。就發射一個默認數據
SequenceEqual 推斷兩個Observable是否按相同的數據序列
SkipUntil 丟棄原始Observable發射的數據。直到第二個Observable發射了一個數據。而後發射原始
SkipWhile 丟棄原始Observable發射的數據,直到一個特定的條件爲假,而後發射原始Observable剩餘的數據
TakeUntil 發射來自原始Observable的數據,直到第二個Observable發射了一個數據或一個通知
TakeWhile 發射原始Observable的數據,直到一個特定的條件爲真,而後跳過剩餘的數據

算術和聚合操做

這些操做符可用於整個數據序列

操做符 含義
Average 計算Observable發射的數據序列的平均值,而後發射這個結果
Concat 不交錯的鏈接多個Observable的數據
Count 計算Observable發射的數據個數,而後發射這個結果
Max 計算併發射數據序列的最大值
Min 計算併發射數據序列的最小值
Reduce 按順序對數據序列的每一個應用某個函數,而後返回這個值
Sum 計算併發射數據序列的和

鏈接操做

一些有精確可控的訂閱行爲的特殊Observable

操做符 含義
Connect 指示一個可鏈接的Observable開始發射數據給訂閱者
Publish 將一個普通的Observable轉換爲可鏈接的
RefCount 使一個可鏈接的Observable表現得像一個普通的Observable
Replay 確保所有的觀察者收到相同的數據序列,即便他們在Observable開始發射數據以後才訂閱

轉換操做

操做符 含義
To 將Observable轉換爲其餘的對象或數據結構
Blocking 堵塞Observable的操做符

參考:
Intro To RxJava 系列教程 - 雲在千峯
給 Android 開發人員的 RxJava 詳解
RxJava 入門 - 傅圓的博客 | MrFu Blog
RxJava學習總結 - 推酷
Operators—-RxWeekend - 傅圓的博客 | MrFu Blog

相關文章
相關標籤/搜索