rxjava lift源碼解析

????最近在看給Android開發者的RxJava詳解這篇文章,前面的都能理解,看到變換的原理——lift()這塊的時候,我的腦袋直接懵逼了,每個單詞我都認識,都能理解,但是連起來就看暈了,因此我花費了一些時間自行閱讀源碼來理解lift的原理,通過本篇文章記錄一下,怕以后又給忘記了(大概率)。

????首先我們來的看一個簡單的rxjava的demo:

? ??

????相信不少新童鞋剛開始看到這些單詞的時候有點暈乎乎的,Observable不是被觀察者嗎,怎么反而訂閱了觀察者Observer呢?其實可以簡單的換個概念,Observable可以看成一個view,Subscriber看成OnClickListener,subscribe()訂閱方法看成setOnClickListener(吐槽一下,這個subscribe如果命名成setOnSubscriber好理解很多)。進入subscribe()源碼:

????這段代碼里咱們需要關注的只有兩行,首先在訂閱的時候調用了subscriber.onStart()方法(所以如果有UI的操作如顯示progressDialog不能放在onStart,因為它跟訂閱處在一個線程里,應該放到doOnSubscribe()),然后調用了onSubscribe.call(),這個就是最開始create傳進來的onSubscribe對象。

????至此,rxjava發送事件邏輯咱們就弄清楚了,接下來看lift究竟是如何將事件進行變換的。以下代碼中,使用lift方法將string事件變換成integer事件:

????按前面的demo,咱們的OnSubscribe發送的事件類型是String,為何在subscriber中接收到的卻是integer對象呢?我們看一下lift方法里到底做了什么:

只有簡簡單單的一行代碼,新建了一個Obsevable對象,并且參數為一個新的OnSubscriberLift(繼承OnSubscribe)對象。

PS:為方便讀者理解,這里定義:

? ? ? ? ?1、create返回的為observable1,lift返回的為observable2

? ? ? ? ?2、create中傳入的為onSubscribe1,lift中新建的為onSubscribe2

? ? ? ? ?3、subscribe()中傳入的為subsribe1,operator返回的為subscribe2

來看看這個類里到底做了啥:

????根據前面分析,subscribe()方法會調用到onSubscribe.call,所以這里是subscribe1.subscribe() -> observable2.onSubscribe2.call,也就是走到上面的代碼,

new Observable(new OnSubscribeLift(this.onSubscribe, operator));

????這個parent就是我們傳入的this.onSubscribe,也就是onSubscribe1,它的call傳入了一個st,這個st就是operator.call返回的subscriber對象。對,就是前面那個new出來的subscriber2。所以onSubscribe1.call - > subscriber2.onNext,而subscriber2.onNext里,我們寫了一行這樣的代碼

subscriber.onNext(Integer.valueOf(s));

????這樣subscriber到底是不是我們要的subscriber1呢?是不是感到很激動,最終的答案就要揭曉了。沒錯,operator.call()方法里,傳入了一個subscriber參數o,這個o正是demo里咱們調用subscribe()方法時傳進來的subscriber對象,也就是subscriber1,看上圖代碼可以知道,最終經過轉換傳回給了subscriber1。流程圖如下圖所示:

????由圖不難分析,lift方法相當于給原本的Observable加了一層代理,subscriber不能直接訪問到onSubscribe,必須由lift()中間做一層事件的處理轉換。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379