RxJava2 (一)訂閱流程源碼閱讀

當前版本 2.2.19
RxJava2 (一)訂閱流程源碼閱讀
RxJava2 (二)取消訂閱流程 dispose( ) 源碼閱讀
RxJava2 (三)線程切換源碼閱讀
RxJava2 (四)切換UI主線程源碼閱讀
RxJava2 (五)just操作符源碼閱讀
RxJava2 (六)map操作符源碼閱讀

代碼示例
Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(ObservableEmitter<String> emitter) throws Exception {
        emitter.onNext("Hello World");
        emitter.onComplete();
    }
})
        .subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                System.out.println("onSubscribe");
            }
            @Override
            public void onNext(String s) {
                System.out.println("onNext: " + s);
            }
            @Override
            public void onError(Throwable e) {
                System.out.println("onError");
            }
            @Override
            public void onComplete() {
                System.out.println("onComplete");
            }
        });
Observable.create()

Observable是一個抽象類,create()最終返回的是Observable的子類ObservableCreate

  • ObservableCreateObservable子類,它持有ObservableOnSubscribe引用.
public abstract class Observable<T> implements ObservableSource<T> {
    public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
        ...
        // RxJavaPlugins.onAssembly(Observable<T> source) 如果source不爲null,會將source直接返回.
        // 最終返回ObservableCreate對象,該對象中持有ObservableOnSubscribe引用
        return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
    }
}
Observable.subscribe()
  • Observable.create()返回的ObservableCreate類型對象是Observable的子類,它沒有重寫父類的subscribe()方法,所以subscribe()最終調用的是Observable中的subscribe()
  • subscribe()中所調用到subscribeActual(),最終調用的是ObservableCreate中的subscribeActual().
// Observable類
public abstract class Observable<T> implements ObservableSource<T> {
    public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
        ...
        // RxJavaPlugins.onAssembly(Observable<T> source) 如果source不爲null,會將source直接返回.
        // 最終返回ObservableCreate對象,該對象中持有ObservableOnSubscribe引用
        return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
    }
    public final void subscribe(Observer<? super T> observer) {
        try {
            // RxJavaPlugins.onSubscribe(this, observer); : 最後返回當前通過參數傳入的observer對象.
            observer = RxJavaPlugins.onSubscribe(this, observer);
            // subscribe()由ObservableCreate對象調用,看它的subscribeActual()實現
            subscribeActual(observer);
        } 
        ...
    }
}
// ObservableCreate類
public final class ObservableCreate<T> extends Observable<T> {
    @Override
    protected void subscribeActual(Observer<? super T> observer) {
        // 創建CreateEmitter對象,然後傳入觀察者(observer)對象
        CreateEmitter<T> parent = new CreateEmitter<T>(observer);
        // 這裏其實調用的就是new Observer()時候自動實現的onSubscribe(Disposable d)方法,
        // 自動實現的onSubscribe(Disposable d)中參數類型是Disposable,
        // 其實CreateEmitter類型實現了Disposable接口.
        observer.onSubscribe(parent);
        try {
            // 上面說明過,ObservableCreate對象中持有ObservableOnSubscribe引用,這個source變量就是ObservableOnSubscribe對象了.
            // ObservableOnSubscribe對象是由自己創建的,並且實現了subscribe(ObservableEmitter<String> emitter)方法.
            // subscribe(ObservableEmitter<String> emitter)中參數類型爲ObservableEmitter,其實CreateEmitter實現了ObservableEmitter接口.
            // 被觀察者就是使用emitter向觀察者發送消息的.
            source.subscribe(parent);
        } catch (Throwable ex) {
            Exceptions.throwIfFatal(ex);
            parent.onError(ex);
        }
    }
}
// 案例中創建ObservableOnSubscribe對象
Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(ObservableEmitter<String> emitter) throws Exception {
        // 使用CreateEmitter發射數據,最終調用Oberver觀察者中的onNext()方法
        emitter.onNext("Hello World");
        emitter.onComplete();
    }
})
emitter.onNext("Hello World")
  • CreateEmitter對象中持有自己創建的觀察者引用(Observer),在ObservableCreate.subscribeActual()實現的.
// 這裏是ObservableOnSubscribe.subscribe(ObservableEmitter<String> emitter)中拿到的emitter對象,通過它發射數據.
emitter.onNext("Hello World");
// ObservableCreate.CreateEmitter類
public final class ObservableCreate<T> extends Observable<T> {
    static final class CreateEmitter<T>extends AtomicReference<Disposable>implements ObservableEmitter<T>, Disposable {
        final Observer<? super T> observer; // 手動創建的Observer觀察者引用
        // CreateEmitter.onNext(T t)後,最終會調用到 observer.onNext(t).
        @Override
        public void onNext(T t) {
            ...
            // 判斷是否取消訂閱
            if (!isDisposed()) {
                observer.onNext(t);
            }
        }
        // 同理onComplete()也是一樣的邏輯調用
        @Override
        public void onComplete() {
            if (!isDisposed()) {
                try {
                    observer.onComplete();
                } finally {
                    dispose();
                }
            }
        }

        @Override
        public boolean isDisposed() {
            return DisposableHelper.isDisposed(get());
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章