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