一.前言
上一篇文章我只介紹了不帶map運算子的原始碼流程分析,這一篇就加上map,其實總體流程和上一篇文章分析的是差不多的,但是這一篇會著重講一下RxJava的洋蔥模型和裝飾模型,當然與map息息相關,
二.分析下帶map的總體流程
以一個map為例
Observable.create(new ObservableOnSubscribe<Object>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Object> emitter) throws Exception {
emitter.onNext("A");
}
})
.map(new Function<Object, Boolean>() {
@Override
public Boolean apply(@NonNull Object o) throws Exception {
return false;
}
})
.subscribe(new Observer<Boolean>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Boolean aBoolean) {
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
還是以訂閱subscribe為觸發點,

它把自定義觀察者(終點)作為引數傳進去了,我們
①進去subscribe看一下

發現subscribeActual是一個抽象方法,我們找它的實作類,也就是呼叫subscribe方法的,是ObservableMap這個類,因為map方法回傳的就是一個ObservableMap物件,所以我們
②進去ObservableMap類找subscribeActual方法

它把自定義觀察者作為引數傳進去了,然后給他封了一層包裹,也就是MapObserver類(用黃框框出來的),這是第一層包裹,然后呼叫source的subscribe方法,把第一層包裹作為引數傳入,而source并不是自定義source,而是上一層觀察者,即ObservableCreate,所以我們
③進去ObservableCreate類找subscribe方法

發現它在第一層包裹的基礎上,又給它封了一層包裹,也就是把第一層包裹作為引數傳入了第二層包裹即發射器,
- 也就是說最終的終點(自定義觀察者)經歷了兩次封裝,第一次是封裝為
MapObserver,我們稱之為第一層包裹,第二次是封裝為CreateEmitter,我們稱之為第二層包裹,
然后呼叫source的subscribe方法,此時的source就是我們的自定義source了,然后把第二層包裹作為引數傳進去
④看自定義source

然后呼叫了發射器的onNext方法,此時我們
⑤看發射器內部的onNext方法是如何實作的(看CreateEmitter類)

發現它呼叫了observer的onNext方法,并且把我們傳入的引數也作為引數傳進去,這個observer是下一層,而不是自定義觀察者,它的下一層就是ObservableMap,我們
⑥進去ObservableMap看一下

首先將我們傳入的值進行了一個變換,即apply方法,然后呼叫下游的onNext方法將變換后的值傳過去,這里我們的下游就是終點,即自定義觀察者,所以就到頭了,
下面我們看下這里的變換,它是呼叫的mapper的apply方法,我們看下mapper是啥

這個mapper說到底是將function傳入賦值的,而這個function又是在創建ObservableMap物件的時候傳入的,我們看下怎么創建的這個ObservableMap類

上圖可以發現是mapper(這個mapper不是上面那個mapper,但最終值都是一樣的)賦值給了function,而這個mapper就是我們在使用map運算子的時候new的Function,也就是這一部分

OK,又回到上面我們進行變換的時候的mapper.apply方法,其實這個apply方法是介面里面的方法,如下圖

實作就是在上上圖的紅圈里實作的,也就是這個變換是我們手動變換的,
ok,以上就是帶map運算子的RxJava代碼執行流程的全原始碼分析,看起來比較亂,我們畫個圖表示就不亂了

這就是洋蔥模型,先封包裹,然后拆包裹,
三.裝飾模型
其實到這還不全,RxJava還用到了裝飾模型
假如用到了兩個map運算子,create方法回傳的是ObservableCreate物件,然后呼叫map方法,相當于將ObservableCreate用ObservableMap包起來,然后又呼叫一次map方法,相當于用ObservableMap將ObservableMap包起來,用圖表示就是這樣子

先裝飾完了之后,再去封包裹,再去拆包裹,
這個流程可以對比買一臺電腦,電腦首先要生產出來,一個零件一個零件由內向外進行包裹,也就是裝飾,生產完了之后,要封包裹才能寄出去,然后你收到快遞之后要拆包裹才能使用,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/291345.html
標籤:其他
