Rxjava2 原始碼解析(六)---執行緒篇
前言
好久沒寫部落格了,主要是最近公司業務比較忙。今天閒下來,所以補了之前的一個坑。
最初學Rxjava的時候,關於執行緒,聽到了一種理解,深信不疑。具體是什麼這裡就不說了,怕誤導大家。直到逐漸瞭解了rxjava的原始碼,慢慢才揭開了rxjava 執行緒控制的真實面紗。
關於具體的subscribeOn 和 observeOn 方法的實現原理,在前面的文章中已經進行了詳細的介紹,所以這裡不再詳述。本篇我們會從整體的鏈式角度來了解執行緒切換。
引入
首先,根據經驗我們知道,不論是什麼樣的呼叫鏈。它的最上層無非就是這樣:
首先呼叫了subscribe進行註冊,然後observable會回撥onSubscribe方法,但是第二個步驟並不一定會如上圖這樣呼叫,下面的例子就會看到,不過並不會影響我們之後的流程分析。
然後observable通知發射源,發射源發射資料。
PS: 第四步畫得醜是有原因的,由於這些操作都是在同一個執行緒中完成的,所以不想讓連線線出現在左側!
例項
那麼我們來畫一個例項的呼叫圖,先舉一個例項類似如下
ObservableX.map.subscribeOn(Thread1).map.observeOn(Thread2).map.subscribe()
鏈挺長的,包括執行subscribe的執行緒(Thread0)總共三個執行緒。
其中ObservableX表示一個任意的Observable。這裡我們就用上面的圖代替(也許就是Observable.Create)
這張圖需要從底部開始往上看,第一步就是線上程t0中呼叫subscribe。如此往上推,一直到追溯到資料來源,資料來源開發傳送資料(通過onNext等方法)。
我們將右側的箭頭稱為上游,因為他是通過追溯的方法一步一步往上層程式碼執行的。將左側的箭頭稱為下游,因為他是反映了真實資料流從最初的發射源一步步發射的過程。
所以從上圖可知,subscribeOn方法是將上游執行緒進行排程,而observeOn方法是排程下游執行緒。
如果呼叫鏈中只定義了subscribeOn的執行緒,沒有定義observeOn的方法,那麼下游執行緒也會被subscribeOn順便改變(說順便是由於subscribeOn改變了源資料傳送的執行緒)。
如果存在observeOn,無論在subscribeOn的之前還是之後,都會改變下游執行緒。
總結
Flowable基本情況相同的!
map,lift 型別的操作符實際上實在subscribe中完成工作內容的,所以處於操作鏈後方的subscribeOn會修改前面的map中內容的執行執行緒。
最後一個observerOn會影響最終的subscribe onNext的執行執行緒
轉載於:https://my.oschina.net/zzxzzg/blog/955376