2015-09-28 86 views
5

在我的項目中,我需要處理不同線程中的對象。要操作流的行爲,我創造新的觀測,以改變他們的observeOn()這樣:操作線程的有效方法RxJava

apiService.getObjects(token) // Retrofit 
       .compose(bindToLifecycle()) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .doOnNext(o -> { 
        // process in Main Thread 
       }) 
       .map(Observable::just) // create new one, to change thread for it 
       .observeOn(Schedulers.io()) 
       .subscribe(o -> { 
        // process in the background thread 
       }); 

但我認爲RxJava還有更多的美麗和有效的方式來處理不同的線程一個響應。我試圖谷歌它,但我沒有找到任何東西。

感謝,
安東

回答

3

處於RX,它通常建議避免在「做」塊副作用(如果流大幹快上訂閱的,才執行),並且更喜歡訂閱代碼。

在你的情況,你可以利用cache()publish()...connect(),如:

query = apiService.getObjects(token) 
      .compose(bindToLifecycle()) 
      .subscribeOn(Schedulers.io()) 
      .cache(); 

query.observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(o -> { 
       // process in Main Thread 
      }) 
query.observeOn(Schedulers.io()) 
      .subscribe(o -> { 
       // process in the background thread 
      }); 

隨着publish()代替cache(),該代碼是相同的,但你可以通過連接流決定何時啓用你的查詢(你在連接2個訂閱後,請撥打query.connect())。

如果您的訂閱工作是後臺計算,Schedulers.computation()可能優於Schedulers.io()

注意AFAICT您的代碼將工作沒有map(Observable::just)線就好了,因爲「observeOn」語句隻影響流進一步回落(而不是以前的「做」語句)

+0

如何計算的?你能解釋發佈 - >連接嗎? –

+0

我更新了答案以涵蓋這2個問題 – Gluck