RxJava 線程切換流程

RxJava 線程切換流程

在客戶端開發中有些時候需要多線程切換
作爲Android開發者中最經典的模型是Handler+Looper+Message,這種寫法稍有不慎會有內存泄漏的風險,後出了RxJava+RxAndroid 因爲使用Rxjava切換線程比較簡單,而且不容易出現令人討厭的Casher。所以本人看了一下RxJava切換線程源碼過程。本文章適合有一定基礎的讀者,只做關鍵代碼解讀。
先上一段簡單的Demo
簡單的使用示例

直接戳進create
在這裏插入圖片描述
RxJavaPlugins 裏的大部分方法都是工具類,可以不需要仔細閱讀
主要看創建了一個ObservableCreate 戳進 ObservableCreate

在這裏插入圖片描述
ObservableCreate 繼承 Observable 構造方法只傳入了 ObservableOnSubscribe 並且把source 設爲了全局對象,這段代碼只能看出來這些。繼續看demo,後面調用了subscribeOn 這次做了一次線程的切換,先選擇切換線程的類型,我這裏選擇了io,戳進subscribeOn 進行查看

在這裏插入圖片描述
忽略掉沒用的,此處的this,應該是當前創建的Observable,subscribe看ObservableSubscribeOn戳進去
在這裏插入圖片描述
只傳入了source 和線程類型scheduler,並super了source 和把線程類型同步成了全局變量 看一下super戳進

在這裏插入圖片描述
此處可以看出 此類最後還是繼承了Observable ,並且把 source 同步成了全局對象,此時切換線程的準備動作已經準備完畢,可以忽略Demo 中間部分的代碼,直接戳到subscribe,subscribe是開始執行的過程,看一下入參爲Observer的subscribe 方法
在這裏插入圖片描述
忽略掉沒用的看一下 subscribeActual 這是個抽象方法
在這裏插入圖片描述
又因爲我們之前做了一次subscribeOn->所以看一下ObservableSubscribeOn裏面的實現

在這裏插入圖片描述
可以看到調用 s.onSubscribe(parent); 由此可見 RxJava的調用方式是由下而上形成一個環形調用
所以Demo中的onSubscribe的線程類型肯定是當前線程
先輸出一下打印結果 : RXActivity: =subscribe2=main 第一次打印
繼續往下看 scheduler.scheduleDirect 此方法 傳入了Runable 但他不是一個線程,後面可以戳進查看
直接戳進scheduleDirect
在這裏插入圖片描述
兩個方法執行的我就貼一起了 ,此處可以看的又new了一個Runable,並且在這個Runable當中調用run,第一次見到這種調用方式,其實後面的代碼中這個Runable也僅僅只是當做一個接口使用,在從第一行看吧,此處調用了createWorker() 先記住次處,後面還是要回到這裏繼續看,戳進createWorker

在這裏插入圖片描述
抽象方法,我這裏寫的io 所以進入io的 IoScheduler 進行查看找到createWorker

在這裏插入圖片描述
在這裏插入圖片描述
需要傳入一個CachedWorkerPool 此處就是new出了一個
在這裏插入圖片描述
最後調用了一個get()方法直接戳進
在這裏插入圖片描述
入參
在這裏插入圖片描述
訂閱之後的名稱都是此名稱,此處new了一個TheadWorker
在這裏插入圖片描述
這就創建成功了,繼續回到原處繼續看忽略掉沒用的調用了w.schedule所以看ThreadWorker當中的schedule方法,ThreadWorker 的schedule方法 在他的父類 NewThreadWorker中 直接戳進
在這裏插入圖片描述
在這裏插入圖片描述
RxJava使用線程池開了一個線程去做io任務,此處只是線程池執行,看一下線程池創建
在這裏插入圖片描述
在這裏插入圖片描述
開啓了一個大小爲一的調度池,看一下執行executor.submit(sr) 戳進sr實例
在這裏插入圖片描述
他也是個Runable 重點關注run方法 開始回執 actual.run()->decoratedRun.run(); 看最後的run

在這裏插入圖片描述
當前對象的source的訂閱事件 可以打印第二個結果就是=subscribe1=RxCachedThreadScheduler-1
這就是Rxjava主線程切io線程的過程,後面是io線程切換至主線程
繼續回到Demo 在往下看observeOn
在這裏插入圖片描述
傳入了一個要切換線程的Scheduler繼續戳進
在這裏插入圖片描述
只看關鍵的ObservableObserveOn繼續戳進
在這裏插入圖片描述
和之前差不多就不重新在寫一遍了看一下super
在這裏插入圖片描述
繼承Observable,切換線程的準備工作已經基本完成
觸發時機也是subscribe ->subscribeActual 看一下 ObservableObserveOn 中的實現
在這裏插入圖片描述
這裏可以看出每observeOn一次都會去創建一個worker 所以每observeOn一次線程都會去改版 而多次subscribeOn只會創建一個worker, 所有每次subscribeOn只會是一個線程 後面是改變subscribe的工作線程狀態,又是一個自上而下的next流程。所有next線程會變更。
因爲我這個地方是切換至安卓主線程,看一下AndroidSchedulers.mainThread()戳進
在這裏插入圖片描述
這個類不長,但是
AndroidSchedulers
並沒有繼承Schedulers 而是 HandlerScheduler 纔是主角
HandlerScheduler需要傳入一個主線程的Looper對象,這一套流程基本上做Android都應該明白,不做過多敘述,繼續戳進看 createWorker()
在這裏插入圖片描述
此處在回到上面看一下執行流程ObservableObserveOn.ObserveOnObserver
在這裏插入圖片描述
最後還是一樣調用了schedule方法 所以此處我們只需要關心 HandlerWorkerschedule方法 戳進
在這裏插入圖片描述
其實由此可以看出RxJava在安卓中的線程切換還是利用了Handler,Looper,Message這就是我對RxJava線程切換的心得體會,謝謝閱讀。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章