在前面的几篇文章
RxJava2笔记(一、事件订阅流程)
RxJava2笔记(二、事件取消流程)
RxJava2笔记(三、订阅线程切换)
RxJava2笔记(四、观察者线程切换)
中,我们对RxJava的整个事件订阅过程以及线程切换做了分析,本文我们将做一个总结性的梳理。
我们总结下这段代码的运行流程
Observer<Integer> observer = new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
Log.i(TAG, "onSubscribe--运行线程:" + Thread.currentThread().getName());
disposable = d;
}
@Override
public void onNext(Integer integer) {
Log.i(TAG, "onNext: " + integer + " --运行线程:" + 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--运行线程:" + Thread.currentThread().getName());
}
};
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) {
Log.i(TAG, "subscribe--运行线程:" + Thread.currentThread().getName());
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
emitter.onComplete();
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
上完代码再上一张流程图,画的不好,请见谅。
RxJava事件流向.png
上图中各个类对象以及相关方法会在哪一级调用均用相同的颜色标出。
从图中可以看出,订阅事件是逐级从下往上传递的,下层的subscribe触发subscribeActual,在内部调用上一级observable的subscribe订阅,继而触发上一级observable的subscribeActual,再在其内部调用上上一级observable的subscribe订阅,就这样订阅事件一直往上传递,直到调用最上游的数据源observable的subscribe订阅。
而数据流的传递与此相反,它是从上往下逐级下发的,当订阅事件传递到最上游的observable时,这个observable开始调用onNext方法发射数据,在这个方法内调用下一级observer的onNext方法;在下一级observer的onNext方法内,再调用下下一级observer的onNext方法。直到最终调用最下游的observer的onNext方法,完成数据流下发。
-
梳理完了订阅流程,再来说下线程切换次数的有效性
-
1、多次切换订阅线程:
假设我们进行了两次订阅线程切换,我们来梳理下流程:
订阅线程多次切换有效性.png
从上图中可以看出,即使我们多次调用subscribeOn切换订阅线程,真正作用于订阅事件的线程是离上游observable最近的一个,根据RxJava的调用习惯也就是第一次调用subscribeOn。所以订阅线程切换只有第一次有效。
-
2、多次切换观察者线程:
同样,假设进行了两次观察者线程切换,看下流程:
观察者线程多次切换有效性.png
可以看到,每一级的observer的onNext方法在不同的线程中均会被调用,所以observeOn方法每次调用都会生效,只不过通常情况下我们都是在最后一次切换观察者线程后才真正接收数据来更新UI界面。
网友评论