????最近在看給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()中間做一層事件的處理轉換链瓦。