DEVLOG 2.7 RxJava(二)RxJava中的三種流,RxLifecycle和RxBus的簡單實(shí)現(xiàn)
參考內(nèi)容:RxJava動腦學(xué)院
代碼倉庫:https://github.com/kolibreath/Practices

基本上看完了這一系列的教程,感覺還可以。老師非常清楚地講解了RxJava中一些重要的點(diǎn),特別是對于RxJava中三個流的歸納我覺得非常到位。下面我來復(fù)盤一下最后一點(diǎn)的內(nèi)容。不過最后RxJava和Retrofit的結(jié)合我沒有看,因?yàn)镽xJava有了協(xié)程之后基本不用了,協(xié)程取消的方式相對于RxJava更加簡單,理解起來也更方便。
本文分成三個部分:
總結(jié)RxJava中的三個流,觀察者流,訂閱流,事件(回調(diào))流
RxLifecycle的實(shí)現(xiàn)
RxBus的實(shí)現(xiàn)

RxJava中的三個流
為了更加清楚地整理和總結(jié)三個流,我將課程中的流程圖自己復(fù)刻了一遍,對于其中的細(xì)節(jié)我也可以說明的更加清楚。
觀察者流(鏈?zhǔn)秸{(diào)用流)
RxJava的鏈?zhǔn)秸{(diào)用通過手寫的過程我們可以發(fā)現(xiàn)其實(shí)就是對于上游(upstream或者是source)的Observable的不斷包裝的過程

這個部分比較好理解,包裝最開始的對象是ObservableOnSubscribe lambda,裝飾器最后的生成的Observable會訂閱Observer lambda,具體的流程如圖。

訂閱流
訂閱流是三個流中最復(fù)雜的地方?;叵胍幌轮笆謱憣?shí)現(xiàn)map操作符時,會將傳入的Observer變成一個MapObserver,然后交給source進(jìn)行訂閱。這個地方非常有意思,傳入的Observer位于map操作符下游,被觀察者source又是通過構(gòu)造方法注入的上游的Observable。因此訂閱流是從下往上的過程:

畫成圖像就是這樣,下游的被觀察者也通過Observer包裝

仔細(xì)看看Observable和Observer交互的部分,N5雖然是下游的被觀察者,但是它通過調(diào)用subscribe會間接調(diào)用被它裝飾的(也就是N4)的subscribe方法。所以在圖上使用虛線表示N5的subscribe對于N4的subscribe的間接調(diào)用關(guān)系。

事件回調(diào)流
最后一個部分是事件回調(diào)流。通過ObservableOnSubscribe#subscribe獲取的Emitter執(zhí)行onNext時,會一層一層地調(diào)用Observer#onNext,這樣就實(shí)現(xiàn)了事件傳遞的目的。
這個部分在圖中使用紅色的虛線表示onNext

整體來看,整個事件調(diào)用的流程圖如下:

這里有幾個細(xì)節(jié)說一下:
最開始的Source表示ObsevableOnSubscribe,會通過subscribe【綁定】一個Emitter,然后這個Emitter發(fā)送消息
并且這個Emitter持有被包裝的Observer的引用,所以最后的O6指向Emitter
subscribeOn和observeOn的作用分析
其實(shí)這兩個操作符都是針對下游發(fā)生作用,但是需要注意的是訂閱流是相反的,它的下游是調(diào)用鏈的上游。如果順著subscribe鏈向下,也就是順著調(diào)用鏈向上,在調(diào)用鏈下游設(shè)置的subscribeOn假設(shè)被執(zhí)行到A線程,一定會被調(diào)用鏈上游的subscribeOn放到B線程去。因此就有在上游設(shè)置subscribeOn會覆蓋下游的subscribeOn的說法。
RxLifecycle實(shí)現(xiàn)分析
實(shí)現(xiàn)目標(biāo),避免內(nèi)存泄漏。
實(shí)現(xiàn)方式:
需要獲取到當(dāng)前的UI組件的生命周期狀態(tài),如果是onDestroy,正在執(zhí)行的耗時操作需要被取消。
怎么取消?通過subscribe返回的操作句柄,disposable取消。
對于第一點(diǎn),我們通過設(shè)計一個類,這個類實(shí)現(xiàn)Android X的LifecycleObserver,監(jiān)聽LifecycleOwner;對于第二點(diǎn),我們使用CompositeDisposable批量管理。同時為了實(shí)現(xiàn)復(fù)用,我們使用compose操作符,傳入一個ObservableTransformer,【攔截】Observable。
具體的代碼如下(我直接在IntelliJ 中寫的,所以是模擬Android X的接口?):
RxBus的實(shí)現(xiàn)分析

如何在訂閱之后收到發(fā)送的事件?使用publishSubject,其他的和別的Bus區(qū)別不大: