總結一下Rxjava一個最基本的訂閱流程是如何實現的,以及Rxjava的設計思路是什麼樣的
訂閱
首先建立一個observer
和observable
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的ObservableOnSubscribe
的subscribe()
到這裡可以看出最簡單的一個訂閱流程是什麼樣的
變化操作
- 以map操作來看,map變化返回了一個
ObservableMap
,也是一個Observable
- 這裡其實可以看出,每一個
Observable
都會有一個subscribeActual()
方法,這個方法在Observable
呼叫subscrible()
之後會被呼叫,也就是說一個Observable
在呼叫subscrible()
之後,實際上的操作邏輯都是在subscribeActual()
裡面 - 在
ObservableMap
的subscribeActual()
裡,呼叫了source.subscribe(new MapObserver<T, U>(t, function));
這句程式碼,source
是上層的observable,引數為包裝過後的observer
即MapObserver
,由圖三可以看出,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
包裝的邏輯都在各自Observable
的subscribeActual
中去做,比如map
變化,就是把observer包裝成MapObserver
然後傳遞到上游.然後源Observable
發射資料的時候就呼叫各自的方法去變換資料,再傳遞下去 也就是說中間各種變化,實際都是把observer給包裝起來,傳遞到源Observable
中去,然後源Observble
發射資料了,就一層層的包裝變換然後傳遞下去
onSubscribe()
是在源Observable建立好emitter發射器之後,會呼叫observer的onSubscribe()
方法,中間如果有變換的話,由於變化產生的Observable會把下游的observer包裝傳給上游,同時自己也儲存了下游包裝過後的的observer,所以會一層層的呼叫下游包裝過的observer的onSubscribe方法,直到最後的源observer