SubscribeOn用于指定Observable执行的Scheduler


android rxjava 使用场景 rxjava subscribeon observeon_android rxjava 使用场景

       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。





android rxjava 使用场景 rxjava subscribeon observeon_操作符_02


   总结

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



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

结论

  1. 下面提到的“操作”包括产生事件、用操作符操作事件以及最终的通过 subscriber 消费事件
  2. 只有第一subscribeOn() 起作用(所以多个 subscribeOn() 毛意义)
  3. 这个 subscribeOn() 控制从流程开始的第一个操作,直到遇到第一个 observeOn()
  4. observeOn() 可以使用多次,每个 observeOn() 将导致一次线程切换(),这次切换开始于这次 observeOn() 的下一个操作
  5. 不论是 subscribeOn() 还是 observeOn(),每次线程切换如果不受到下一个 observeOn() 的干预,线程将不再改变,不会自动切换到其他线程