在前面的幾篇文章
RxJava2筆記(一螟够、事件訂閱流程)
RxJava2筆記(二、事件取消流程)
RxJava2筆記(三峡钓、訂閱線程切換)
RxJava2筆記(四妓笙、觀察者線程切換)
中,我們對(duì)RxJava的整個(gè)事件訂閱過程以及線程切換做了分析椒楣,本文我們將做一個(gè)總結(jié)性的梳理给郊。
我們總結(jié)下這段代碼的運(yùn)行流程
Observer<Integer> observer = new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
Log.i(TAG, "onSubscribe--運(yùn)行線程:" + Thread.currentThread().getName());
disposable = d;
}
@Override
public void onNext(Integer integer) {
Log.i(TAG, "onNext: " + integer + " --運(yùn)行線程:" + Thread.currentThread().getName());
mToolbar.setTitle(integer + "");
}
@Override
public void onError(Throwable e) {
Log.i(TAG, "onError: " + e.getMessage());
e.printStackTrace();
}
@Override
public void onComplete() {
Log.i(TAG, "onComplete--運(yùn)行線程:" + Thread.currentThread().getName());
}
};
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) {
Log.i(TAG, "subscribe--運(yùn)行線程:" + Thread.currentThread().getName());
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
emitter.onComplete();
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
上完代碼再上一張流程圖,畫的不好捧灰,請(qǐng)見諒淆九。
上圖中各個(gè)類對(duì)象以及相關(guān)方法會(huì)在哪一級(jí)調(diào)用均用相同的顏色標(biāo)出统锤。
從圖中可以看出,訂閱事件是逐級(jí)從下往上傳遞的炭庙,下層的subscribe觸發(fā)subscribeActual饲窿,在內(nèi)部調(diào)用上一級(jí)observable的subscribe訂閱,繼而觸發(fā)上一級(jí)observable的subscribeActual焕蹄,再在其內(nèi)部調(diào)用上上一級(jí)observable的subscribe訂閱逾雄,就這樣訂閱事件一直往上傳遞,直到調(diào)用最上游的數(shù)據(jù)源observable的subscribe訂閱腻脏。
而數(shù)據(jù)流的傳遞與此相反鸦泳,它是從上往下逐級(jí)下發(fā)的,當(dāng)訂閱事件傳遞到最上游的observable時(shí)永品,這個(gè)observable開始調(diào)用onNext方法發(fā)射數(shù)據(jù)做鹰,在這個(gè)方法內(nèi)調(diào)用下一級(jí)observer的onNext方法;在下一級(jí)observer的onNext方法內(nèi)鼎姐,再調(diào)用下下一級(jí)observer的onNext方法钾麸。直到最終調(diào)用最下游的observer的onNext方法,完成數(shù)據(jù)流下發(fā)炕桨。
梳理完了訂閱流程饭尝,再來說下線程切換次數(shù)的有效性
-
1、多次切換訂閱線程:
假設(shè)我們進(jìn)行了兩次訂閱線程切換献宫,我們來梳理下流程:
訂閱線程多次切換有效性.png
從上圖中可以看出钥平,即使我們多次調(diào)用subscribeOn切換訂閱線程,真正作用于訂閱事件的線程是離上游observable最近的一個(gè)遵蚜,根據(jù)RxJava的調(diào)用習(xí)慣也就是第一次調(diào)用subscribeOn帖池。所以訂閱線程切換只有第一次有效。
-
2吭净、多次切換觀察者線程:
同樣睡汹,假設(shè)進(jìn)行了兩次觀察者線程切換,看下流程:
觀察者線程多次切換有效性.png
可以看到寂殉,每一級(jí)的observer的onNext方法在不同的線程中均會(huì)被調(diào)用囚巴,所以observeOn方法每次調(diào)用都會(huì)生效,只不過通常情況下我們都是在最后一次切換觀察者線程后才真正接收數(shù)據(jù)來更新UI界面友扰。