RxJava2学习记录

RxJava2笔记(五、订阅流程梳理以及线程切换次数有效性)

2019-01-11  本文已影响6人  WonderSky_HY

在前面的几篇文章
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方法,完成数据流下发。


从上图中可以看出,即使我们多次调用subscribeOn切换订阅线程,真正作用于订阅事件的线程是离上游observable最近的一个,根据RxJava的调用习惯也就是第一次调用subscribeOn。所以订阅线程切换只有第一次有效。

上一篇 下一篇

猜你喜欢

热点阅读