Android技能樹 - Rxjava源碼(1) 之 初步結構

前言

之前寫相關的RxJava的文章比較少,也就下面二篇:java

目需求討論 — 手把手帶你寫RxPermissionbash

RxJava小考題 -- Rxjava源碼分析(一)ide

用了這麼久的RxJava,因此想要作個總結,因此打算也寫一個RxJava源碼分析 的系列(因此不是簡單的說明如何使用RxJava步驟,看以前也最好會使用RxJava):源碼分析

Android技能樹 - Rxjava源碼系列(1) 之 初步結構post

Android技能樹 - Rxjava源碼系列(2) 之 Observable和Observer(待寫)ui

Android技能樹 - Rxjava源碼系列(3) 之 線程切換(待寫)this

Android技能樹 - Rxjava源碼系列(4) 之 經常使用操做符(待寫)spa

正文

咱們仍是經過基礎的例子來進行講解,好比你有個快遞,你很想知道快遞是否已經到小區,你可能想要在快遞剛到你的小區的時候就立刻知道,而後立刻就能享受拆快遞所帶來的樂趣,畢竟等待快遞的時候實在太煎熬了。線程

那咱們有什麼方式來肯定快遞是否到了小區呢? 翻譯

1. 輪詢 和 更新發送

1.1 輪詢

咱們能夠每隔1分鐘,就打個電話給快遞小哥,問他個人快遞是否是已經送到了,這樣當快遞小哥剛送貨到你的小區的時候,你都最多能在不超過一分鐘內知道快遞已經到小區了。(缺點也很明顯,電話費很貴,同時你不怕小哥打死你的話,你也能夠用這種方式)

1.2 更新發送

當快遞小哥把快遞送到你的小區的時候,通常都是二種方式:1. 他可能直接打你的電話通知你下來拿快遞;2. 統一放在快遞貨櫃中,而後你會收到貨櫃的短信通知,根據開櫃號碼去拿快遞。

明顯這種數據更新後主動通知的方式,咱們更容易接受,你們都開心,小哥也不會打死你。可是上面咱們也說了快遞小哥通知你的方式有二種:直接通知你/貨櫃接收快遞,貨櫃再通知你

快遞員到了小區後,通知你的二種方式又分別對應了什麼模式?

2.觀察者模式和發佈訂閱模式

咱們上面已經提到了快遞小哥到了你小區,有二種方式通知你,其實這裏對應了 觀察者模式和發佈訂閱模式這二種模式。其實我之前也老是把這二個模式弄混,感受都差很少,因此在和別人討論的時候都是混着說着這個名詞,後來看了網上相關的文章,發現這兩者仍是有點不一樣的,正對應了上面你收到快遞的信息同樣的區別。

2.1 觀察者模式

對應的就是咱們的快遞員把快遞送到了小區後,直接打電話給你,說你快下來拿下快遞;這時候快遞員是直接跟你本人直接溝通的

2.2 發佈訂閱模式

對應的就是咱們的快遞員把快遞送到小區後,把快遞放在快遞櫃中,而後快遞員只要把你的手機號碼輸入到快遞櫃,而後把快遞放入到具體的某個快遞櫃的格子中,就能夠直接走人了,等會會由快遞櫃這邊通知你快遞到了,而後過來取快遞。

兩者最大的區別是什麼?

我直接引用網上的其餘文章的內容:兩種模式都存在訂閱者和發佈者(具體觀察者可認爲是訂閱者、具體目標可認爲是發佈者),可是觀察者模式是由具體目標調度的,而發佈/訂閱模式是統一由調度中心調的,因此觀察者模式的訂閱者與發佈者之間是存在依賴的,而發佈/訂閱模式則不會。

那RxJava是屬於上面的二種的哪種呢?

咱們直接看GitHub上的RxJava介紹:

看不懂的咱們直接谷歌翻譯走起:

咱們能夠看到介紹,說是擴展了觀察者模式,因此說明咱們的Rxjava是直接把觀察者註冊到了發佈者。而沒有中間的調度中心。因此也就是咱們上面的快遞員直接打電話通知你下來拿快遞的方式。

3.Rxjava的具體分析

咱們使用RxJava最基礎的方式是什麼?

咱們剛開始學如何使用的時候,估計百分之99的都是先學會使用create操做符:

Observable.create(new ObservableOnSubscribe<Object>() {
        @Override
        public void subscribe(ObservableEmitter<Object> emitter) throws Exception {

        }
    }).subscribe(new Observer<Object>() {
        @Override
        public void onSubscribe(Disposable d) {
            
        }

        @Override
        public void onNext(Object o) {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onComplete() {

        }
    });
複製代碼

其實這個最基礎的瞭解了後,看其餘的什麼just,fromArray等就都理解了;固然咱們既然是RxJava系列的第一篇初步結構,因此我也不會立刻就講解各類源碼,咱們能夠先模仿一個簡單的,好比:

Observable.just(1)
    .subscribe(new Observer<Integer>() {
        @Override
        public void onSubscribe(Disposable d) {
            
        }

        @Override
        public void onNext(Integer integer) {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onComplete() {

        }
    });
複製代碼

咱們能夠這樣先模仿這個簡單的,寫個效果同樣的僞代碼,瞭解一下基本的東西便可。

因此若是咱們寫了一個簡單的版本的RxJava應該是這樣的:

Observer.java:

public class Observer<T> {

    @Override
    public void onSubscribe(Disposable d) {
    }

    public void onNext(T obj) {
    }

    public void onError(Throwable e) {
    }

    public void onComplete() {
    }
}

複製代碼

Observable.java:

public class Observable<T> {

    T value;
    Observer<? super T> observer;
    
    //just傳進來的數值,等會要發送給Observer
    public void just(T value) {
        this.value = value;
    }

    public final void subscribe(Observer<? super T> observer) {
        //把Observer註冊到Observable中,其實就等於Observable拿了Observer的對象,等會好調用它相應的方法
        this.observer = observer;
        
        //生成Disposable對象,調用observer的onSubscribe方法
        Disposable a = xxxxxxx;
        observer.onSubscribe(a);
        
        //咱們已經拿到了Observer對象,能夠作相關邏輯了
        start();
    }

    private void start() {
        try {
            //咱們把just傳進的數值,經過已經拿到的Observer對象,調用onNext把數值給它
            observer.onNext(value);
            //發送完了以後執行onComplete()方法說明結束了。
            observer.onComplete();
        } catch (Exception e) {
            //若是中間出現異常,就調用Observer的onError方法
            observer.onError(e);
        }
    }
}
複製代碼

是否是感受,臥槽,原來這麼簡單嗎?沒錯,這樣看來咱們也的確是Observable直接持有了Observer的對象,也的確符合上面咱們說的Rxjava使用的是觀察者模式,而不是發佈訂閱模式。

因此如今初步來看RxJava目前來看三步走:

結語

由於只是第一篇初步結構,因此內容也十分簡單,後續會具體分析相關的源碼內容。

相關文章
相關標籤/搜索