2017-10-12 42 views
0

我对subscribeOn运营商的工作有些怀疑。我读了一些关于这方面的文章。subscribeOn是如何工作的

observeOn是很容易理解,它只改变downstram,并改变影响所有的downstream

但正如文章subscribeOn can be put in any place in the stream because it affects only the time of subscription.在说:

要理解这一点,我做了samlpe,并试图在每个时间点记录的线程。

  Observable.just("Hello") 
        .map(s -> { 
         Log.d(TAG, s + " in " + Thread.currentThread()); 
         return 1; 
        }) 
        .subscribeOn(Schedulers.newThread()) 
        .map(integer -> { 
         Log.d(TAG, integer + " in " + Thread.currentThread()); 
         return true; 
        }) 
        .map(aBoolean -> { 
         Log.d(TAG, aBoolean + " in " + Thread.currentThread()); 
         return 11.0; 
        }) 
        .subscribeOn(Schedulers.computation()) 
        .subscribe(aDouble -> { 
         Log.d(TAG, "accept in " + Thread.currentThread()); 
         Log.d(TAG, "accept: " + aDouble); 
        }); 

结果是

    Hello in Thread[RxNewThreadScheduler-1,5,main] 
       1 in Thread[RxNewThreadScheduler-1,5,main] 
       true in Thread[RxNewThreadScheduler-1,5,main] 
       accept in Thread[RxNewThreadScheduler-1,5,main] 
       accept: 11.0 

这里两次,我在申请subscribeOn,但每次添加的第一个似乎在整个流应用。

任何人都可以请用简单的话来解释它是如何实际工作的,因为我是一个初学者,很难消化这个!

在此先感谢

+0

如果我记得是正确的,'subscribeOn'描述开始,即哪个线程将启动排放。如果有多个声明,只会使用第一个。 –

+0

最接近观察者的'subscribeOn'获胜。第二个被忽略 – Raghunandan

+0

SubscribeOn将被用于创建observable。所以创建只能在线程上进行,所以只有subscribeOn对于一个可观察对象才是可能的。 –

回答

2

subscribeOn:如果你有多个subscribeOn那么第一个生效。如果要在制作subscribeOn后更改流上的调度程序,请看看observeOn

observeOn:它会更改调度程序的下行。

例如:

just("Some String") // Computation 
    .subscribeOn(Schedulers.computation()) // it changes scheduler to computation beginning from source to observer. 
    .map(str -> str.length()) // Computation 
    .observeOn(Schedulers.io) //change the scheduler from here till the observer 
    .map(length -> 2 * length) // io 
    .subscribe(number -> Log.d("", "Number " + number));// io