RXjava observeOn subscribeOn 解析

RXjava 中的observeOn subscribeOn 兩個函數十分類似,相信很多人在使用時會有疑問。官方文檔的說明,包括圖片不是那麼容易理解,特此立翻譯貼一篇。

官方文檔解釋如下地址:

http://reactivex.io/documentation/operators/observeon.html

http://reactivex.io/documentation/operators/subscribeon.html


=================================    observeOn 篇   ========================================

指定觀察者運行的Scheduler(Scheduler即指定的所在線程)

ObserveOn

(圖片解釋:重點是箭頭,初始化黑色箭頭代表默認線程,調用observeOn方法 黃色箭頭指定Scheduler,所以下面的箭頭都變成了黃色,即改變了代碼運行所在的線程)


很多基於ReactiveX 的實現使用Schedulers來控制一個被觀察者在多個線程之間切換。你可以通過observeOn操作來指定一個Scheduler,命令一個被觀察者通過此Scheduler發送通知給觀察者。

ObserveOn and SubscribeOn

(圖解:這個圖很牛逼!先表揚一下......我們從上往下看,初始化(xian)箭(cheng)頭顏色不再跟第一張圖是黑色的了,而是藍色的,我們發現下面有個subscribeOn 方法是指定藍色(xian)箭(cheng)頭的,沒錯,原因就在這裏,具體爲什麼等會翻譯subscribeOn的時候再說。然後是一個observeOn方法指定黃色(xian)箭(cheng)頭,然後是一個map操作,(xian)箭(cheng)頭是黃色的,然後是subscribeOn操作,暫時略過,最後又是observeOn操作,指定的是粉色(xian)箭(cheng)頭,這個操作之後,黃色(xian)箭(cheng)頭變爲了粉色(xian)箭(cheng)頭。)


subscribeOn操作是類似的,但是subscribeOn是控制被觀察者在哪一個Scheduler上執行自身的操作(onsubscribe的call方法)以及通知觀察者的操作(onNext,onCompleted,map等)。


默認情況下,被觀察者以及被觀察者的調用鏈操作會在調用subscribe方法的線程上執行。subscribeOn操作能指定一個特殊的Scheduler,從而改變這個行爲,使被觀察者的操作在這個Scheduler上執行。observeOn操作指定一個不同的Scheduler,被觀察者會在這個Scheduler上發送通知給觀察者。


在上述圖中,subscribeOn操作指定被觀察者在哪一個線程執行操作,不論在調用鏈中哪一個位置調用這個方法。

observeOn影響observeOn操作之後的被觀察者運行的線程。因爲這個原因,你可以在調用鏈中多次調用observeOn來達到改變運行的所在線程。


=================================    subscribeOn篇   ========================================

指定被觀察者運行的Scheduler

SubscribeOn

(圖解:區別上一篇,在調用subscribeOn方法後,初始化的線程也是黃色箭頭的,所以兩者的區別在於作用域不同,subscribeOn影響整個被觀察者的運行所在線程,observeOn影響的是observeOn操作後的代碼)


很多基於ReactiveX 的實現使用Schedulers來控制一個被觀察者在多個線程之間切換。你可以通過subscribeOn操作來指定一個Scheduler,命令一個被觀察者通過此Scheduler執行工作。(對比上文observeOn中此處的解釋,理解他們之間的區別)


observeOn操作也是相似的,但是observeOn操作侷限性大一點。observeOn僅僅影響被觀察者在哪個Schedulers上發送通知給觀察者。

(接下去的內容跟observeOn篇是一樣的)


==========================================   補充   =========================================

看完文章,我們明白observeOn可以多次調用,調度不同線程執行操作,但對於subscribeOn多次調用的情況下會如何,官方文檔中並未提及。

從源碼中分析,subscribeOn會生成一個新的被觀察者對象,老的被觀察者會被新對象持有,類似包裝類模式,新對象對老對象的操作就是將老對象丟到指定的新線程中去執行,所以!不管你調用幾次subscribeOn,最終還是會回到第一次調用subscribeOn指定的線程中去。(包裝類不管包裝幾次,一次一次往裏調用,最終還是會調用到最根本的那一個類中去)



發佈了37 篇原創文章 · 獲贊 31 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章