RxJava2.0源碼分析

首先要明確RxJava的訂閱流程 使用方式 = 基於事件流的鏈式調用

步驟1:創建被觀察者(Observable)& 定義需發送的事件
步驟2:創建觀察者(Observer) & 定義響應事件的行爲
步驟3:通過訂閱(subscribe)連接觀察者和被觀察者

分析的實例代碼如下:

Observable.create(new ObservableOnSubscribe<Integer>() {

        @Override
        public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
            emitter.onNext(1);
            emitter.onComplete();
        }
    }).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() {

        }
    });

1、先分析Observable如何創建

點create方法進去看到new ObservableCreate並且返回
ObservableCreate是Observable的子類,子類複寫了重要的subscribeActual方法

@Override
protected void subscribeActual(Observer<? super T> observer) {
    CreateEmitter<T> parent = new CreateEmitter<T>(observer);
    observer.onSubscribe(parent);

    try {
        source.subscribe(parent);
    } catch (Throwable ex) {
        Exceptions.throwIfFatal(ex);
        parent.onError(ex);
    }
}

2、分析Observable什麼時候發送事件

上面ObservableCreate看出只有調subscribeActual方法纔會執行source.subscribe方法
所以在沒訂閱之前subscribe裏面方法只是定義

3、分析Observer如何創建

裏面就通過Observer接口來生成,接口內含4個方法,分別用於響應對應於被觀察者發送的不同事件

4、分析subscribe訂閱做了什麼

我們來看Observable中的subscribe方法

@Override
public final void subscribe(Observer<? super T> observer) {
    ObjectHelper.requireNonNull(observer, "observer is null");
    try {
        observer = RxJavaPlugins.onSubscribe(this, observer);

        ObjectHelper.requireNonNull(observer, "The RxJavaPlugins.onSubscribe hook returned a null Observer. Please change the handler provided to RxJavaPlugins.setOnObservableSubscribe for invalid null returns. Further reading: https://github.com/ReactiveX/RxJava/wiki/Plugins");

        subscribeActual(observer);
    } catch (NullPointerException e) { // NOPMD
        throw e;
    } catch (Throwable e) {
        Exceptions.throwIfFatal(e);
        // can't call onError because no way to know if a Disposable has been set or not
        // can't call onSubscribe because the call might have set a Subscription already
        RxJavaPlugins.onError(e);

        NullPointerException npe = new NullPointerException("Actually not, but can't throw other exceptions due to RS");
        npe.initCause(e);
        throw npe;
    }
}

看到沒,主要是調了Observable的subscribeActual(observer)的方法,ObservableCreate是Observable的子類,自然就會調到ObservableCreate複寫的subscribeActual,這時就會調ObservableOnSubscribe的subscribe方法,就開始發送事件emitter.onNext(1)。就開始發送事件了

5、分析下emitter.onNext(1)做了什麼

我們點emitter.onNext進去啥也沒有,因爲它是接口,對於接口類型的,我們都應該找它們的實現的子類
我們看下ObservableEmitter,結果它也是接口,繼續找實現的子類
還是得點create方法一步步找在ObservableCreate找到CreateEmitter實現的子類
順便重點分析下subscribeActual方法

@Override
protected void subscribeActual(Observer<? super T> observer) {
    CreateEmitter<T> parent = new CreateEmitter<T>(observer);
    observer.onSubscribe(parent);

    try {
        source.subscribe(parent);
    } catch (Throwable ex) {
        Exceptions.throwIfFatal(ex);
        parent.onError(ex);
    }
}

分析發現

  1. CreateEmitter實現了ObservableEmitter和Disposable接口
  2. CreateEmitter<T> parent = new CreateEmitter<T>(observer) 即parent是實現了ObservableEmitter,Disposable的對象,並且封裝了observer。可以簡單認爲它具有這三者的功能
  3. observer.onSubscribe(parent),這裏的parent就是封裝後的Disposable。也就會調Observer的onSubscribe方法
  4. source.subscribe(parent),開始調Observable的subscribe,並傳入了帶有observer的CreateEmitter

這時可以看CreateEmitter的onNext方法,也就是emitter.onNext(1)做了什麼

@Override
    public void onNext(T t) {
        if (t == null) {
            onError(new NullPointerException("onNext called with null. Null values are generally not allowed in 2.x operators and sources."));
            return;
        }
        if (!isDisposed()) {
            observer.onNext(t);
        }
    }  

驚訝的發現,裏面其實就是調了observer.onNext,這樣就把事件發送到了observer,observer的onNext也就調用了
還有看到沒有observer.onNext(t)調之前都有!isDisposed()判斷,這也是爲什麼Disposable可以切斷Observable和Observer之間的連接
但Observable還是會繼續發事件,只是Observer不接收了的緣故

分析完挺愉悅的,喜歡就點個贊!!!

感謝:https://www.jianshu.com/p/e1c48a00951a文檔

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