RxJava之just源碼解讀

上一節我們主要講了from的實現的原理,這講我們主要分析的是just的源碼
廢話不多說,直接進入主題。

我們主要分析的是just的實現原理,subscribe的方法,我在這裏不多解析,因爲在前兩章中,都對這個方法有詳細的解釋,如有不懂的,可以參見前一章,或是在底部留言,謝謝。

我們說過just方法,是對create的方法的一個封裝,就像是create的簡化版,首先我們上一張有關just的圖:

這裏寫圖片描述

這是一個最基本的just的方法的實現,當然subscribe中也可以傳入Subscriber對象或是Action對象,這裏對這兩個不做過多的講解,so easy。

看了這麼一個最簡單的實現,有沒有感覺RxJava的鏈式調用超級好用呢?
代碼看上去很整潔,調用也很簡單,但是這並不是我們的最終的目的,我們最終的目的,是知道它實現的具體的原理。

再來看一張圖:

這裏寫圖片描述

1:和上次不同的是,當調用just的方法的時候,傳入的是一個泛型數據,而from,傳入的是Iterable類型的對象。
2:Returns an Observable that emits a single item and then completes.,這個是它的解釋,意思是創建一個被觀察者,它只是發送單一的一次數據,然後結束。
3:from,是發送多次數據,這和just有明顯的不同。
4:create方法,也只是創建了一個ScalarSynchronousObservable,這個ScalarSynchronousObservable是繼承自Observable的

從create點進去,我們可以看到:

這裏寫圖片描述

它也是通過構造方法,創建了一個Obsevable對象。再後來是把我們 創建的list保存在了一個以t命名的變量當中。

接下來的subscribe方法的執行的分析過程,和上一張subscribe的原理一樣,這裏不多介紹,介紹的是當我們執行subscribe方法的時候,調用了這邊的call方法,我們可以看到,這個是

public void call(Subscriber<? super T> s) {
                s.setProducer(createProducer(s, t));
            }
`
下面我們看下createProducer具體的邏輯是什麼:

![這裏寫圖片描述](https://img-blog.csdn.net/20161021043215758)``

我們看到,這裏有一個Strong_Mode字段,這個字段可以通過這樣設置:
![這裏寫圖片描述](https://img-blog.csdn.net/20161021044209591)

當我們不設置的時候,這個值默認是false,也就是我們默認使用的是
WeakSingleProducer。那麼可能有人會問,到底這兩個producer有什麼區別呢,不急不急,容我慢慢道來,

我們先來看下這兩個類:

WeakSingleProducer implements Producer
SingleProducer extends AtomicBoolean implements Producer
“`
剛開始,我還以爲是跟弱引用有關呢,哈哈,傻逼了,,,通過源碼看到,兩個producer,不同的一點是SingleProducer實現了AtomicBoolean,顧名思義,這個單詞的意思是原子性,原子性的解釋是:

原子是世界上的最小單位,具有不可分割性。比如 a=0;(a非long和double類型) 這個操作是不可分割的,那麼我們說這個操作時原子操作。再比如:a++; 這個操作實際是a = a + 1;是可分割的,所以他不是一個原子操作。非原子操作都會存在線程安全問題,需要我們使用同步技術(sychronized)來讓它變成一個原子操作。一個操作是原子操作,那麼我們稱它具有原子性。

再看下它的註解,也正是這個意思,WeakSingleProducer,它在多線程中執行是不安全的。

setProducer方法,就是去調用request方法:

這裏寫圖片描述

這個request方法,就是調用subscribe中產生的observer2,然後observer2的onNext調用observer1的onNext,而它發射的時候,是發射我們一開始just傳入的值,所以這裏我們只會調用onNext方法一次,這也是just和from的區別之一。結束之後,調用onCompleted。

可能有人會問,just方法,有好幾個重載的方法,那麼當有多個參數傳入的時候,他是怎麼發送的呢?
有這種好奇心是好的,那麼現在讓我們來好好的分析一下把。

這裏寫圖片描述

重這個圖片中,我們看到,當我們在just中傳入多個參數的時候,RxJava會把多個參數合併成一個數組,
這裏寫圖片描述

我們看到當n=0的時候,只是設置了empty,因爲沒有數據,最後調用一下onComplete方法,當n=1的時候,就是我們上面分析的這種情況,我們這邊重點看下n>1的時候,它會new一個OnSubscribeFromArray,這個也是繼承自OnSubscribe,所以和我們以前的分析一樣,
重點注意下下面這張圖,

這裏寫圖片描述

我們可以看到當傳過來的是個數組的時候,我們會循環獲取數組裏面的每個元素遍歷發送,直到結束,所以我們可以得到這樣的結論,當just的方法中傳入多個參數的時候,RxJava會把他們組裝成一個數組,然後在發送的時候,循環獲取裏面的內容進行發送,會調用多次的onNext的方法。

至此,just的分析基本完成,如有疑問,清留言謝謝,下次解讀的是map的源碼,希望大家的光臨,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章