2017-10-12 64 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