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

青蛙要fly發表於2019-02-11

前言

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

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

RxJava小考題 -- Rxjava原始碼分析(一)

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

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

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

Android技能樹 - Rxjava原始碼系列(3) 之 執行緒切換(待寫)

Android技能樹 - Rxjava原始碼系列(4) 之 常用操作符(待寫)

正文

我們還是通過基礎的例子來進行講解,比如你有個快遞,你很想知道快遞是否已經到小區,你可能想要在快遞剛到你的小區的時候就馬上知道,然後馬上就能享受拆快遞所帶來的樂趣,畢竟等待快遞的時候實在太煎熬了。

那我們有什麼方式來確定快遞是否到了小區呢?

1. 輪詢 和 更新傳送

1.1 輪詢

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

1.2 更新傳送

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

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

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

2.觀察者模式和釋出訂閱模式

我們上面已經提到了快遞小哥到了你小區,有二種方式通知你,其實這裡對應了 觀察者模式和釋出訂閱模式這二種模式。其實我以前也總是把這二個模式弄混,感覺都差不多,所以在和別人討論的時候都是混著說著這個名詞,後來看了網上相關的文章,發現這二者還是有點不同的,正對應了上面你收到快遞的資訊一樣的區別。

2.1 觀察者模式

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

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

2.2 釋出訂閱模式

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

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

二者最大的區別是什麼?

我直接引用網上的其他文章的內容:兩種模式都存在訂閱者和釋出者(具體觀察者可認為是訂閱者、具體目標可認為是釋出者),但是觀察者模式是由具體目標排程的,而釋出/訂閱模式是統一由排程中心調的,所以觀察者模式的訂閱者與釋出者之間是存在依賴的,而釋出/訂閱模式則不會。

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

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

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

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

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

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

我們可以看到介紹,說是擴充套件了觀察者模式,所以說明我們的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目前來看三步走:

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

結語

因為只是第一篇初步結構,所以內容也十分簡單,後續會具體分析相關的原始碼內容。

相關文章