先看一个例子,源码如下:
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的线程开始执行任务。