1. 程式人生 > >rxJava和rxAndroid原始碼解析系列四之subscribeOn和observeOn的理解(學習終結篇)

rxJava和rxAndroid原始碼解析系列四之subscribeOn和observeOn的理解(學習終結篇)

本篇文章主要解決subscribeOn和observeOn這兩個方法為什麼subscribeOn只有一次有效果,observeOn切換多次回撥的都有效果。

不知道朋友有沒有看過rxandroid的原始碼,如果看過的話,就會迎刃而解,沒什麼疑慮啦。沒看過原始碼的朋友,可以看看我這個系列的前幾篇文章,主要是系列二和系列三的文章,講述了執行緒切換的問題。在這裡我只說一下這兩個方法執行緒切換的時機以及Observable建立和訂閱的關係。

 

結合前幾個系列的文章我們知道,程式碼的鏈式呼叫就是建立observable的過程,而且每建立一個observable,都有一個指向上一個observable的成員變數。當開始發起訂閱的時候,也就是建立observer的過程,且是一個向最開始建立的Obserable傳遞Observer的過程。而observer是上層包裹下層的observer。當建立完首個obserbable的observer的時候開始回撥事件(onNext,onError,onComplete),是從上往下回調。

下圖是對上面文字描述的具象描述。

 紅色箭頭組合的圖形就是程式碼執行的軌跡,可以看出先建立observable,然後訂閱,最後回撥事件。當呼叫subscribeOn建立的ObservableSubscribeOn進行訂閱的時候會進行執行緒切換。也就是說subscribeOn是當往上層訂閱的時候進行執行緒切換。呼叫observeOn建立的ObserableObserveOn進行下層回撥前會切換執行緒。

我們對資料流的處理(Function和Action)都是在observer回撥裡面呼叫的這些處理的具體實現(Function apply)的。

 那我們就解釋一下為什麼subscribeOn只有一次有效果,observeOn切換多次回撥的都有效果。假如鏈式呼叫裡面只調用subscribeOn的話,沒有observeOn。根據紅色箭頭的組合圖形,訂閱時候發生執行緒切換,然後回撥事件也線上程裡面,因為observeOn進行回撥執行緒切換,我們的前提是沒有observeOn,所以回撥的時候沒有執行緒切換,還在subscribeOn切換的執行緒裡面回撥。

如果呼叫多個subscribeOn,沒有observeOn呼叫。每次訂閱的時候都切換執行緒,事件回撥(observer回撥)不切換執行緒,那回調事件執行肯定在最上層的那個在訂閱時候發生切換執行緒的那個執行緒裡面,也就是說鏈式呼叫的首個subscribeOn執行緒切換有效。

observeOn為什麼可以呼叫多次都有效果,因為資料流的處理是框架程式碼設計暴露出來的,而且是在事件回撥的時候才執行資料流的處理,所以observeOn每次切換資料的時候都有效果。

 

當然subscribeOn和onserveOn實際上都進行執行緒的切換了。只是執行效果體現處理這樣的現象。

第一次寫技術框架的文章,寫得不好之處,忘各位大神指正!