为什么subscribeOn第一次执行生效,observeOn每次执行都生效?

  • 本篇不想用太多底层源码去分析,而是会用整体的角度去分析

前置知识

  • 阅读过作者另一篇文章 RxJava—一图胜千言
  • RxJava使用
  • 阅读过subscribeOnobserveOn的源码(无论看懂与否,只要大概看过即可)

如何通过“RxJava—一图胜千言”来分析这个问题?

  1. 首先,通过 RxJava—一图胜千言 ,我们可以知道RxJava的大体流程分三步:① 创建所有被观察者对象; ② 调用subscribe 的瞬间,由最下游开始注册观察者,一直注册到最上游; ③ 注册到最上游时,由最上游往最下游发送数据(调用所有注册的观察者的onNext)
  2. 接着,我告诉大家:一、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似乎是没有生效的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值