Android技能樹(shù) - Rxjava源碼(1) 之 初步結(jié)構(gòu)

前言

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

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

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

用了這么久的RxJava,所以想要做個(gè)總結(jié),所以打算也寫一個(gè)RxJava源碼分析 的系列(所以不是簡(jiǎn)單的說(shuō)明如何使用RxJava步驟,看之前也最好會(huì)使用RxJava):

Android技能樹(shù) - Rxjava源碼系列(1) 之 初步結(jié)構(gòu)

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

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

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

正文

我們還是通過(guò)基礎(chǔ)的例子來(lái)進(jìn)行講解,比如你有個(gè)快遞,你很想知道快遞是否已經(jīng)到小區(qū),你可能想要在快遞剛到你的小區(qū)的時(shí)候就馬上知道,然后馬上就能享受拆快遞所帶來(lái)的樂(lè)趣,畢竟等待快遞的時(shí)候?qū)嵲谔灏玖恕?/strong>

那我們有什么方式來(lái)確定快遞是否到了小區(qū)呢?

1. 輪詢 和 更新發(fā)送

1.1 輪詢

我們可以每隔1分鐘,就打個(gè)電話給快遞小哥,問(wèn)他我的快遞是不是已經(jīng)送到了,這樣當(dāng)快遞小哥剛送貨到你的小區(qū)的時(shí)候,你都最多能在不超過(guò)一分鐘內(nèi)知道快遞已經(jīng)到小區(qū)了。(缺點(diǎn)也很明顯,電話費(fèi)很貴,同時(shí)你不怕小哥打死你的話,你也可以用這種方式)

1.2 更新發(fā)送

當(dāng)快遞小哥把快遞送到你的小區(qū)的時(shí)候,一般都是二種方式:1. 他可能直接打你的電話通知你下來(lái)拿快遞;2. 統(tǒng)一放在快遞貨柜中,然后你會(huì)收到貨柜的短信通知,根據(jù)開(kāi)柜號(hào)碼去拿快遞。

明顯這種數(shù)據(jù)更新后主動(dòng)通知的方式,我們更容易接受,大家都開(kāi)心,小哥也不會(huì)打死你。但是上面我們也說(shuō)了快遞小哥通知你的方式有二種:<font color = red>直接通知你/貨柜接收快遞,貨柜再通知你</font>

快遞員到了小區(qū)后,通知你的二種方式又分別對(duì)應(yīng)了什么模式?

2.觀察者模式和發(fā)布訂閱模式

我們上面已經(jīng)提到了快遞小哥到了你小區(qū),有二種方式通知你,其實(shí)這里對(duì)應(yīng)了 觀察者模式和發(fā)布訂閱模式這二種模式。其實(shí)我以前也總是把這二個(gè)模式弄混,感覺(jué)都差不多,所以在和別人討論的時(shí)候都是混著說(shuō)著這個(gè)名詞,后來(lái)看了網(wǎng)上相關(guān)的文章,發(fā)現(xiàn)這二者還是有點(diǎn)不同的,正對(duì)應(yīng)了上面你收到快遞的信息一樣的區(qū)別。

2.1 觀察者模式

對(duì)應(yīng)的就是我們的快遞員把快遞送到了小區(qū)后,直接打電話給你,說(shuō)你快下來(lái)拿下快遞;這時(shí)候快遞員是直接跟你本人直接溝通的

2.2 發(fā)布訂閱模式

對(duì)應(yīng)的就是我們的快遞員把快遞送到小區(qū)后,把快遞放在快遞柜中,然后快遞員只要把你的手機(jī)號(hào)碼輸入到快遞柜,然后把快遞放入到具體的某個(gè)快遞柜的格子中,就可以直接走人了,等會(huì)會(huì)由快遞柜這邊通知你快遞到了,然后過(guò)來(lái)取快遞。

二者最大的區(qū)別是什么?

我直接引用網(wǎng)上的其他文章的內(nèi)容:兩種模式都存在訂閱者和發(fā)布者(具體觀察者可認(rèn)為是訂閱者、具體目標(biāo)可認(rèn)為是發(fā)布者),但是觀察者模式是由具體目標(biāo)調(diào)度的,而發(fā)布/訂閱模式是統(tǒng)一由調(diào)度中心調(diào)的,所以觀察者模式的訂閱者與發(fā)布者之間是存在依賴的,而發(fā)布/訂閱模式則不會(huì)。

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

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

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

我們可以看到介紹,說(shuō)是擴(kuò)展了觀察者模式,所以說(shuō)明我們的Rxjava是直接把觀察者注冊(cè)到了發(fā)布者。而沒(méi)有中間的調(diào)度中心。所以也就是我們上面的快遞員直接打電話通知你下來(lái)拿快遞的方式。

3.Rxjava的具體分析

我們使用RxJava最基礎(chǔ)的方式是什么?

我們剛開(kāi)始學(xué)如何使用的時(shí)候,估計(jì)百分之99的都是先學(xué)會(huì)使用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() {

        }
    });

其實(shí)這個(gè)最基礎(chǔ)的了解了后,看其他的什么just,fromArray等就都理解了;當(dāng)然我們既然是RxJava系列的第一篇初步結(jié)構(gòu),所以我也不會(huì)馬上就講解各種源碼,我們可以先模仿一個(gè)簡(jiǎn)單的,比如:

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() {

        }
    });

我們可以這樣先模仿這個(gè)簡(jiǎn)單的,寫個(gè)效果一樣的偽代碼,了解一下基本的東西即可。

所以如果我們寫了一個(gè)簡(jiǎn)單的版本的RxJava應(yīng)該是這樣的:

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傳進(jìn)來(lái)的數(shù)值,等會(huì)要發(fā)送給Observer
    public void just(T value) {
        this.value = value;
    }

    public final void subscribe(Observer<? super T> observer) {
        //把Observer注冊(cè)到Observable中,其實(shí)就等于Observable拿了Observer的對(duì)象,等會(huì)好調(diào)用它相應(yīng)的方法
        this.observer = observer;
        
        //生成Disposable對(duì)象,調(diào)用observer的onSubscribe方法
        Disposable a = xxxxxxx;
        observer.onSubscribe(a);
        
        //我們已經(jīng)拿到了Observer對(duì)象,可以做相關(guān)邏輯了
        start();
    }

    private void start() {
        try {
            //我們把just傳進(jìn)的數(shù)值,通過(guò)已經(jīng)拿到的Observer對(duì)象,調(diào)用onNext把數(shù)值給它
            observer.onNext(value);
            //發(fā)送完了之后執(zhí)行onComplete()方法說(shuō)明結(jié)束了。
            observer.onComplete();
        } catch (Exception e) {
            //如果中間出現(xiàn)異常,就調(diào)用Observer的onError方法
            observer.onError(e);
        }
    }
}

是不是感覺(jué),臥槽,原來(lái)這么簡(jiǎn)單嗎?沒(méi)錯(cuò),這樣看來(lái)我們也的確是Observable直接持有了Observer的對(duì)象,也的確符合上面我們說(shuō)的Rxjava使用的是觀察者模式,而不是發(fā)布訂閱模式。

所以現(xiàn)在初步來(lái)看RxJava目前來(lái)看三步走:

結(jié)語(yǔ)

因?yàn)橹皇堑谝黄醪浇Y(jié)構(gòu),所以內(nèi)容也十分簡(jiǎn)單,后續(xù)會(huì)具體分析相關(guān)的源碼內(nèi)容。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容