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。
总结
如果我们有一段这样的序列
Observable
.map // 操作1
.flatMap // 操作2
.subscribeOn(io)
.map //操作3
.flatMap //操作4
.observeOn(main)
.map //操作5
.flatMap //操作6
.subscribeOn(io) //!!特别注意
.subscribe(handleData)
Observable
.map // 操作1
.flatMap // 操作2
.subscribeOn(io)
.map //操作3
.flatMap //操作4
.observeOn(main)
.map //操作5
.flatMap //操作6
.subscribeOn(io) //!!特别注意
.subscribe(handleData)
假设这里我们是在主线程上调用这段代码,那么
操作1,操作2是在io线程上,因为之后subscribeOn切换了线程
操作3,操作4也是在io线程上,因为在subscribeOn切换了线程之后,并没有发生改变。
操作5,操作6是在main线程上,因为在他们之前的observeOn切换了线程。
特别注意那一段,对于操作5和操作6是无效的
操作1
操作2
subscribeOn
操作3
操作4
subscribeOn
操作5
操作6
observeOn
操作5
操作6
结论
- 下面提到的“操作”包括产生事件、用操作符操作事件以及最终的通过 subscriber 消费事件
- 只有第一subscribeOn() 起作用(所以多个 subscribeOn() 毛意义)
- 这个 subscribeOn() 控制从流程开始的第一个操作,直到遇到第一个 observeOn()
- observeOn() 可以使用多次,每个 observeOn() 将导致一次线程切换(),这次切换开始于这次 observeOn() 的下一个操作
- 不论是 subscribeOn() 还是 observeOn(),每次线程切换如果不受到下一个 observeOn() 的干预,线程将不再改变,不会自动切换到其他线程