rxjava lift源碼解析

????最近在看給Android開發(fā)者的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發(fā)送事件邏輯咱們就弄清楚了,接下來看lift究竟是如何將事件進行變換的雷逆。以下代碼中弦讽,使用lift方法將string事件變換成integer事件:

????按前面的demo,咱們的OnSubscribe發(fā)送的事件類型是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()中間做一層事件的處理轉換链瓦。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末拆魏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子慈俯,更是在濱河造成了極大的恐慌渤刃,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,331評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贴膘,死亡現(xiàn)場離奇詭異卖子,居然都是意外死亡,警方通過查閱死者的電腦和手機刑峡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評論 3 398
  • 文/潘曉璐 我一進店門洋闽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人氛琢,你說我怎么就攤上這事喊递∷嫔粒” “怎么了阳似?”我有些...
    開封第一講書人閱讀 167,755評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铐伴。 經常有香客問我撮奏,道長,這世上最難降的妖魔是什么当宴? 我笑而不...
    開封第一講書人閱讀 59,528評論 1 296
  • 正文 為了忘掉前任畜吊,我火速辦了婚禮,結果婚禮上户矢,老公的妹妹穿的比我還像新娘玲献。我一直安慰自己,他們只是感情好梯浪,可當我...
    茶點故事閱讀 68,526評論 6 397
  • 文/花漫 我一把揭開白布捌年。 她就那樣靜靜地躺著,像睡著了一般挂洛。 火紅的嫁衣襯著肌膚如雪礼预。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,166評論 1 308
  • 那天虏劲,我揣著相機與錄音托酸,去河邊找鬼褒颈。 笑死,一個胖子當著我的面吹牛励堡,可吹牛的內容都是我干的谷丸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,768評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼念秧,長吁一口氣:“原來是場噩夢啊……” “哼淤井!你這毒婦竟也來了?” 一聲冷哼從身側響起摊趾,我...
    開封第一講書人閱讀 39,664評論 0 276
  • 序言:老撾萬榮一對情侶失蹤币狠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后砾层,有當地人在樹林里發(fā)現(xiàn)了一具尸體漩绵,經...
    沈念sama閱讀 46,205評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,290評論 3 340
  • 正文 我和宋清朗相戀三年肛炮,在試婚紗的時候發(fā)現(xiàn)自己被綠了止吐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,435評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡侨糟,死狀恐怖碍扔,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情秕重,我是刑警寧澤不同,帶...
    沈念sama閱讀 36,126評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站溶耘,受9級特大地震影響二拐,放射性物質發(fā)生泄漏。R本人自食惡果不足惜凳兵,卻給世界環(huán)境...
    茶點故事閱讀 41,804評論 3 333
  • 文/蒙蒙 一百新、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧庐扫,春花似錦饭望、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碘勉,卻和暖如春巷挥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背验靡。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工倍宾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雏节,地道東北人。 一個月前我還...
    沈念sama閱讀 48,818評論 3 376
  • 正文 我出身青樓高职,卻偏偏與公主長得像钩乍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子怔锌,可洞房花燭夜當晚...
    茶點故事閱讀 45,442評論 2 359