RxJava之SubscribeOn

17 篇文章 0 订阅

 SubscribeOn用于指定Observable执行的Scheduler



       ReactiveX使用Scheduler来管理Observable在多线程环境中的线程切换。通过SubscribeOn操作符可以指定Observable在特定的Scheduler中执行。
ObserveOn操作符类似,但是它只能指定Observable向Observer发送的通知在特定的Scheduler中执行。
       其中Observable的执行是指,调用Observable的call方法,通知Observer是指调用Observer的onNext,onCompleted,onError。


      默认情况下,Observable和应用于该Observable的所有操作链,会在subscribe()方法调用的同一个线程中被执行,通知Observer也是在该线程中被执行。SubscribeOn可以改变这种默认行为,SubscribeOn操作符指示Observable执行于指派的Scheduler(线程)中,而不是运行在subscribe()方法被调用的线程。ObserveOn操作符指示Observable在指派Scheduler(线程)中发送通知给Observer。


      如下图所示,SubscribeOn操作符指派了Observable的执行线程,无论你在操作符链的何处调用改操作符。ObservableOn则影响了Observable接下来的操作符所使用的线程。所以,ObserveOn操作符可以在Observable的操作符链中被调用多次,以此来切换操作符执行的线程。




   总结

      如果我们有一段这样的序列

Observable
.map                    // 操作1
.flatMap                // 操作2
.subscribeOn(io)
.map                    //操作3
.flatMap                //操作4
.observeOn(main)
.map                    //操作5
.flatMap                //操作6
.subscribeOn(io)        //!!特别注意
.subscribe(handleData)

假设这里我们是在主线程上调用这段代码,那么

  1. 操作1操作2是在io线程上,因为之后subscribeOn切换了线程

  2. 操作3操作4也是在io线程上,因为在subscribeOn切换了线程之后,并没有发生改变。

  3. 操作5操作6是在main线程上,因为在他们之前的observeOn切换了线程。

  4. 特别注意那一段,对于操作5操作6是无效的

结论

  1. 下面提到的“操作”包括产生事件、用操作符操作事件以及最终的通过 subscriber 消费事件

  2. 只有第一subscribeOn() 起作用(所以多个 subscribeOn() 毛意义)

  3. 这个 subscribeOn() 控制从流程开始的第一个操作,直到遇到第一个 observeOn()

  4. observeOn() 可以使用多次,每个 observeOn() 将导致一次线程切换(),这次切换开始于这次 observeOn() 的下一个操作

  5. 不论是 subscribeOn() 还是 observeOn(),每次线程切换如果不受到下一个 observeOn() 的干预,线程将不再改变,不会自动切换到其他线程





参考: http://reactivex.io/documentation/operators/subscribeon.html

             https://segmentfault.com/a/1190000004856071

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值