RxJava之map源碼解析

上次主要講了最基本的from與just源碼,今天我們主要講的是RxJava中轉換符map的使用與實現的原理。
首先我們先上一段超級簡單的方法。看下圖:
這裏寫圖片描述

這個函數,我們可以很清楚的知道最後打印出來的內容是“圓圓”,“袁斌”,接下來再來看一個簡單的函數:
這裏寫圖片描述
這個函數,我們通過觀察可以知道打印出來的是5和5。
那麼RxJava是怎麼實現把一個對象通過map函數轉換成一個name字符串的,hello轉換成length的呢?
其實它是這樣的
1:create函數,我們會用一個變量OnSubscribe來保存create方法傳入的一個匿名函數,我們在這裏暫且叫他是OnSubscribe1,create創建完成之後,返回了一個新的Observable,我們先叫他爲Observable1,防止後面混淆,調用map函數的時候,其實是observable1調用的,在map函數中,傳入了一個function,我們來看它的具體的源碼,如下:
這裏寫圖片描述
在這個函數中,看到了一個新的對象OperateMap,這個類實現了Operator接口,而Operator又是繼承自Fun1,所以它有一個call方法,
我們調用map函數的時候,只是在OperatorMap中保存了對當前函數的的引用,當調用lift的時候,
這裏寫圖片描述

可以看到,入參是一個OperateMap對象,出參也是new了一個Observable,我們暫且說它是Observable2,同時Observable2中的OnSubscribe2保存了lift函數中OnSubscribe的引用,
當調用了subscribe方法的時候,就是我們有訂閱者訂閱的時候,
如下圖:
這裏寫圖片描述
當上面那個方法調用的時候,其實這個方法的onSubscribe是OnSubscribe2,也就是說是OnSubscribe2.call(Observer),這個Observer是我們在subscribe方法中傳入的訂閱者,call方法一執行,就會調用到lift方法裏面的call方法,Subscriber<? super T> st = hook.onLift(operator).call(o);這個方法,入參o是還是我們自己new 出來的observer,也就是說調用了OperateMap中的call方法。
如下圖:
這裏寫圖片描述
這個方法返回了一個新的Subscriber2,

 onSubscribe.call(st2)

把當前的Subscriber2作爲入參,調用了OnSubscribe1的call方法,也就是我們在create中自己寫的方法,而從觀察可以看到,我們自己寫的方法中,入參是Subscriber2,所以會調用到OperateMap中的onNext的方法,onNext方法會獲取map函數中func轉換後的值,傳給我們寫的Observer,這樣就完成了map的轉換
下面我們來梳理下具體的執行的過程:
1:create方法創建了Observable1,OnSubscribe1
2:map方法,保存fun的引用,創建了Observable2和OnSubsribe2
3:subscribe方法,創建了Subscriber1,調用了OnSubscribe2中的call方法,並把Subscriber1作爲入參傳入。返回subscriber2.
4:調用OnSubscribe1中的call方法,並把subscriber2傳入,
5:調用subscriber2的onNext的方法,
6:調用subscribe1中的方法。

剛開始感覺這樣看着頭痛,一萬個不舒服, 現在好多了,哈哈,相信你也是可以的。

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