Rxjava2解析-訂閱流程

檸檬茶就是力量發表於2019-07-23

總結一下Rxjava一個最基本的訂閱流程是如何實現的,以及Rxjava的設計思路是什麼樣的

訂閱

首先建立一個observerobservable

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

            }
        };
複製程式碼
 Observable.create(new ObservableOnSubscribe<Object>() {
            @Override
            public void subscribe(ObservableEmitter<Object> emitter) throws Exception {

            }
        });
複製程式碼
  • 先看Observable的建立過程,create()只是把傳進去ObservableOnSubscribe物件包裝了一層返回,這裡可以忽略

  • 然後是ObservableOnSubscribe類的內部

    final ObservableOnSubscribe<T> source;

    public ObservableCreate(ObservableOnSubscribe<T> source) {
        // 1
        this.source = source;
    }

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

        try {
        // 3 
            source.subscribe(parent);
        } catch (Throwable ex) {
            Exceptions.throwIfFatal(ex);
            parent.onError(ex);
        }
    }
複製程式碼
1. 在這裡把傳進來的ObservableOnSubscribe物件儲存起來
2. 這裡new了一個Emitter,也就是我們用來onNext,onError的類,然後把Emitter傳給observer中,由於CreateEmitter實現了Disposable介面,所以可以看到Observer裡有一個onSubscribe(Disposable d),我們可以用來控制流的結束等操作,實際上這個Disposable就是源Obserable建立的,
3. 這裡把Emitter傳給source,也就是傳給我們new的ObservableOnSubscribesubscribe()

到這裡可以看出最簡單的一個訂閱流程是什麼樣的

變化操作

  • 以map操作來看,map變化返回了一個ObservableMap ,也是一個Observable

image.png

image.png
image.png

  • 這裡其實可以看出,每一個Observable 都會有一個subscribeActual()方法,這個方法在Observable呼叫subscrible()之後會被呼叫,也就是說一個Observable在呼叫subscrible()之後,實際上的操作邏輯都是在subscribeActual()裡面
  • ObservableMapsubscribeActual()裡,呼叫了source.subscribe(new MapObserver<T, U>(t, function)); 這句程式碼,source是上層的observable,引數為包裝過後的observerMapObserver,由圖三可以看出,MapObserver內部的onNext是往下游傳遞一個經過apply()變化過後的資料,也就達到了我們用map變化資料的功能了。

結論

  • Observable只有在呼叫了subscribed()訂閱了observer之後才會開始整個流程,呼叫了subscribed()之後會呼叫到subscribeActual(Observer<? super U> t) 實際上就是把observer從最下游,往上面傳遞。 而在subscribeActual(Observer<? super U> t)這個方法內,會呼叫source.subscribe(Observer);也就是說最下游開始訂閱之後,中間的每一個Observable都會呼叫到subscribeActual方法,然後呼叫source也就是上一個Observable的subscribe方法,這樣就做到了把observer往上傳。然後downstream儲存下游的Observable,這樣子做是為了上游傳遞資料的時候,自己先經過變化,然後再把資料給傳遞到下游 中間具體把observer包裝的邏輯都在各自ObservablesubscribeActual中去做,比如map變化,就是把observer包裝成MapObserver然後傳遞到上游.然後源Observable發射資料的時候就呼叫各自的方法去變換資料,再傳遞下去 也就是說中間各種變化,實際都是把observer給包裝起來,傳遞到源Observable中去,然後源Observble發射資料了,就一層層的包裝變換然後傳遞下去

image.png

  • onSubscribe()是在源Observable建立好emitter發射器之後,會呼叫observer的onSubscribe()方法,中間如果有變換的話,由於變化產生的Observable會把下游的observer包裝傳給上游,同時自己也儲存了下游包裝過後的的observer,所以會一層層的呼叫下游包裝過的observer的onSubscribe方法,直到最後的源observer
    image.png

相關文章