RxJava2——2之线程调度

先看一个例子,源码如下:

Observable.create(new ObservableOnSubscribe<String>() {

    @Override
    public void subscribe(ObservableEmitter<String> emitter) throws Exception {
        Log.e("OnSubscribe thread:", Thread.currentThread().getName());
        emitter.onNext("开始了");

    }
})
        .observeOn(Schedulers.single())//21第一次observeOn RxSingleScheduler
        .subscribeOn(Schedulers.newThread())//11第一次subscribeOn RxNewThreadScheduler
        // 进行一些运算处理
        .map(new Function<String, String>() {
            @Override
            public String apply(String s) throws Exception {
                Log.e("map thread:", Thread.currentThread().getName());
                return s + "map添加的值";
            }
        })// 进行过滤操作,只有字符串长度大于0,才能继续

        .filter(new Predicate<String>() {

            @Override
            public boolean test(String s) throws Exception {
                Log.e("filter thread:", Thread.currentThread().getName());
                return !TextUtils.isEmpty(s);
            }
        })
        .observeOn(Schedulers.computation())//22第二次observeOn RxComputationThreadPool
        .subscribeOn(Schedulers.io())//12第二次subscribeOn RxCachedThreadScheduler
        .subscribe(new Observer<String>() {

            @Override
            public void onSubscribe(Disposable d) {
                Log.e("onSubscribe thread:", Thread.currentThread().getName());
            }

            @Override
            public void onNext(String s) {
                Log.e("onNext thread:", Thread.currentThread().getName());
            }

            @Override
            public void onError(Throwable e) {
                Log.e("onError thread:", Thread.currentThread().getName());
            }

            @Override
            public void onComplete() {
                Log.e("onComplete thread:", Thread.currentThread().getName());
            }
        });

.subscribeOn(Schedulers.newThread())//11第一次subscribeOn RxNewThreadScheduler

.subscribeOn(Schedulers.io())//12第二次subscribeOn RxCachedThreadScheduler

.observeOn(Schedulers.single())//21第一次observeOn RxSingleScheduler

.observeOn(Schedulers.computation())//22第二次observeOn RxComputationThreadPool

(1)打开11,其他关闭,运行发现只有Create中是在main线程,其他都是在Schedulers.newThread()线程(11)。结果如下图:

(2)打开11和12,其他关闭。运行结果与(1)一样。

(3)打开12,其他关闭。运行发现只有Create中是在main线程,其他都是在Schedulers.io()线程(12)。结果如下图:

(4)打开21,其他关闭。运行发现Create中是在main线程,Observer的onSubscribe的方法中也是在main线程;其他都是在Schedulers.single()线程(21)。结果如下图:

(5)打开21和22,其他关闭。运行发现Create中是在main线程,Observer的onSubscribe方法中也是在main线程;map和filter是在Schedulers.single()线程(21);Observer的onNext方法中是在Schedulers.computation()线程(22)。

(6)打开22,其他关闭。运行发现只有Observer的onNext方法中是在Schedulers.computation()线程(22),其他都是在main线程。结果如下图:

(7)打开11和21,其他关闭。运行发现Create中是在main线程,Observer的onSubscribe方法是在Schedulers.newThread()线程(11);map、filter和Observer的onNext方法是在Schedulers.single()线程(21)。

(8)打开11、21和12,其他关闭。运行结果与(7)一样。

(9)打开21和12或者打开22和12。运行结果:12影响了Observer的onSubscribe方法;21和22影响了map、filter和Observer的onNext方法。

(10)都打开。运行发现Create中是在main线程,Observer的onSubscribe方法是在Schedulers.newThread()线程(11);map和filter是在Schedulers.single()线程(21);Observer的onNext方法中是在Schedulers.computation()线程(22)。

总结:

1、subscribeOn和observeOn都不会影响到Observable的onCreate方法,subscribeOn和observeOn都可以影响map、filter方法。

2、observeOn不会影响到Observer的onSubscribe方法。

3、多个subscribeOn时只有第一个起作用。

4、多个observeOn时,当前observeOn只影响就近的代码,到下一个observeOn时就不再影响,交由下一个observeOn处理。

一、线程调度subscribeOn的设置方法如下

查看subscribeOn方法如下

ObservableSubscribeOn类间接的继承了Observable类,其中构造方法和subscribeActual方法如下

SubscribeTask为ObservableSubscribeOn的内部类,其中source为创建的Observable对象(即ObservableSubscribeOn),parent指的是SubscribeOnObserver

SubscribeOnObserver为ObservableSubscribeOn的内部类,其中onNext,onError,onComplete与new Observer的方法相对应。

在ObservableSubscribeOn类的SubscribeActual方法有下述代码指定线程

Scheduler类的scheduleDirect方法

在Worker的线程开始执行任务。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章