Subscriber
和Observer
不只基本使用方式同樣。實質上,在 RxJava
的 subscribe
過程當中。Observer
也老是會先被轉換成一個 Subscriber
再使用。因此假設你僅僅想使用基本功能。選擇 Observer
和 Subscriber
是全然同樣的。它們的差異對於使用者來講主要有兩點:android
onStart()
: 這是 Subscriber
添加的方法。它會在 subscribe
剛開始。而事件還未發送以前被調用。可以用於作一些準備工做。好比數據的清零或重置。這是一個可選方法,默認狀況下它的實現爲空。數組
需要注意的是,假設對準備工做的線程有要求(好比彈出一個顯示運行進度的對話框。這必須在主線程運行)。 onStart()
就不適用了,因爲它老是在 subscribe
所發生的線程被調用,而不能指定線程。要在指定的線程來作準備工做。可以使用 doOnSubscribe()
方法。詳細可以在後面的文中看到。緩存
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