先看一個例子,源碼如下:
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的線程開始執行任務。