首先要明確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);
}
}
分析發現
- CreateEmitter實現了ObservableEmitter和Disposable接口
- CreateEmitter<T> parent = new CreateEmitter<T>(observer) 即parent是實現了ObservableEmitter,Disposable的對象,並且封裝了observer。可以簡單認爲它具有這三者的功能
- observer.onSubscribe(parent),這裏的parent就是封裝後的Disposable。也就會調Observer的onSubscribe方法
- 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不接收了的緣故
分析完挺愉悅的,喜歡就點個贊!!!