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