最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

DEVLOG 2.7 RxJava(二)RxJava中的三種流,RxLifecycle和RxBus的簡單實(shí)現(xiàn)

2022-02-07 16:10 作者:房頂上的鋁皮水塔  | 我要投稿

參考內(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更加簡單,理解起來也更方便。

本文分成三個部分:

  1. 總結(jié)RxJava中的三個流,觀察者流,訂閱流,事件(回調(diào))流

  2. RxLifecycle的實(shí)現(xiàn)

  3. 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é)說一下:

  1. 最開始的Source表示ObsevableOnSubscribe,會通過subscribe【綁定】一個Emitter,然后這個Emitter發(fā)送消息

  2. 并且這個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)方式:

  1. 需要獲取到當(dāng)前的UI組件的生命周期狀態(tài),如果是onDestroy,正在執(zhí)行的耗時操作需要被取消。

  2. 怎么取消?通過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ū)別不大:


DEVLOG 2.7 RxJava(二)RxJava中的三種流,RxLifecycle和RxBus的簡單實(shí)現(xiàn)的評論 (共 條)

分享到微博請遵守國家法律
郓城县| 吉首市| 博客| 固阳县| 高唐县| 江陵县| 万源市| 瑞昌市| 崇义县| 漠河县| 闸北区| 开江县| 潮州市| 比如县| 榆中县| 永善县| 石阡县| 永寿县| 措美县| 阿拉尔市| 藁城市| 永胜县| 龙南县| 郴州市| 修水县| 阜南县| 大洼县| 西昌市| 鄂尔多斯市| 尚志市| 行唐县| 焦作市| 崇信县| 普陀区| 江源县| 衡东县| 青铜峡市| 宿松县| 伊吾县| 琼结县| 名山县|