你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

面试:Rxjava线程切换原理

2021/12/13 12:36:37

Q1:为什么 subscribeOn() 只有第一次切换有效

因为 RxJava 最终能影响 ObservableOnSubscribe 这个匿名实现接口的运行环境的只能是最后一次运行的 subscribeOn() ,又因为 RxJava 订阅的时候是从下往上订阅,所以从上往下第一个 subscribeOn() 就是最后运行的,这就造成了写多个 subscribeOn() 只有第一个subscribeOn()有用。
如下图:subscribeOn()产生的线程切换发生在代码执行的第二层,而它的回溯又将会执行在新的线程中。因此,在subscribeOn切换线程以后的流程,均将在新的线程中执行。

observeOn()产生的线程切换都发生在第三层执行层,而在切换线程前的业务代码由于已经执行了,故不受切换线程切换的影响。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ls5mMUr2-1588413213214)(https://note.youdao.com/src/09B1E92C38784C9E9FC41CCC8A5AB080)]

 Q2:每一次observeOn的使用,都会将后面的观察者(同上)和将要切换的线程内容封装起来。

每次observeOn都会切换后面内容的执行线程。

Q3:observeOn() 的线程切换原理

总结:

  1. 子线程切换主线程:给主线程所在的Handler发消息,然后就把逻辑切换过去了。

  2. 主线程切换子线程:把任务放到线程池中执行就能把执行逻辑切换到子线程

  3. 子线程切换子线程:把任务分别扔进两个线程就行了。

Q4:线程控制Scheduler

可以利用 subscribeOn() 结合 observeOn() 来实现线程控制,让事件的产生和消费发生在不同的线程。又知道map(),和flatMap()等可以做不同的变换,那么也可以通过多次地调用函数来实现多次线程的切换

Observable.just(1, 2, 3, 4) // IO 线程,由 subscribeOn() 指定
    .subscribeOn(Schedulers.io())
    .observeOn(Schedulers.newThread())
    .map(mapOperator) // 新线程,由 observeOn() 指定
    .observeOn(Schedulers.io())
    .map(mapOperator2) // IO 线程,由 observeOn() 指定
    .observeOn(AndroidSchedulers.mainThread) 
    .subscribe(subscriber);  // Android 主线程,由 observeOn() 指定

相关文章:RxJava2如何实现链式调用和线程切换_欢迎交流-CSDN博客_rxjava2 切换线程