序
- 本篇不想用太多底层源码去分析,而是会用整体的角度去分析
前置知识
- 阅读过作者另一篇文章 RxJava—一图胜千言
- RxJava使用
- 阅读过
subscribeOn
和observeOn
的源码(无论看懂与否,只要大概看过即可)
如何通过“RxJava—一图胜千言”来分析这个问题?
- 首先,通过 RxJava—一图胜千言 ,我们可以知道RxJava的大体流程分三步:① 创建所有被观察者对象; ② 调用subscribe 的瞬间,由最下游开始注册观察者,一直注册到最上游; ③ 注册到最上游时,由最上游往最下游发送数据(调用所有注册的观察者的onNext)
- 接着,我告诉大家:一、subscribeOn 是在第二步的订阅过程中进行线程切换的; 二、observeOn是在第三步的发送数据过程中进行线程切换的(大概可以看成
上游onNext()
方法内部开启新线程
,新线程内部执行下游onNext
})
1、先分析subscribeOn
- 总结:实际上不是第一次执行生效,而是每次执行都会生效,只不过后面的几次切换,使用者感受不到罢了
2、再分析observeOn
- 总结:切换一次线程,那么其下游的onNext就是在新线程中执行,因此每次都会生效
总结
- subscribeOn 改变的是 “此节点开始,往上游的所有订阅,以及最上游往最下游发送数据的线程”;
- 根据这个定义,分析下
Observable.create().subscribeOn().map().subscribeOn()
- 由本篇文章可知,切换线程发生在订阅过程,因此
第二个subscribeOn
的切换先生效,此时根据定义可知,第二个subscribeOn()、map()、第一个subscribeOn()、create()的订阅过程、以及 create().subscribeOn().map().subscribeOn()的数据发送过程 ,都会切换到新线程执行; - 接着,等到
第一个subscribeOn
的订阅开始,切换线程,此时根据定义可知create()的订阅过程、create().subscribeOn().map().subscribeOn()的数据发送过程,都会切换到新线程中执行(第一个subscribeOn
规定的新线程)。 - 那么此时会发现,只有 第二个subscribeOn()、map()的订阅过程 会在
第二个subscribeOn
规定的线程中执行,而用户感知不到订阅的过程(用户感知到的只有数据的发送过程);因此在用户的角度来看,第二个subscribeOn
似乎是没有生效的。
- 由本篇文章可知,切换线程发生在订阅过程,因此