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的線程開始執行任務。

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