天天看點

rxJava和rxAndroid源碼解析系列四之subscribeOn和observeOn的了解

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

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

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

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

rxJava和rxAndroid源碼解析系列四之subscribeOn和observeOn的了解

 紅色箭頭組合的圖形就是代碼運作的軌迹,可以看出先建立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實際上都進行線程的切換了。隻是運作效果展現處理這樣的現象。

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

下一篇講述rxjava的disposable