2017-09-06 106 views
1

假設我有Android上下面的情況:切換線程中的Rx鏈多次

1)從網絡 2組的請求列表)顯示對於每個組的一些用戶界面元素 爲每個組3)請求項 4)顯示UI elemets因爲我想做到這一點使用RxJava每個項目

webService.requestGroups() 
     .flatMap(group -> { 
      view.showGroup(group); 
      return webService.requestItems(group); 
     }) 
     .toList() 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 

     .subscribe(items -> view.showItems(items)); 

正如你可以看到我有2呼籲視圖對象,每個都必須在主線程上執行。另外2個調用webService,它必須在後臺線程上執行。

這段代碼的問題:第一次調用view會在Android RuntimeException的背景上執行(只有原始線程可能會觸及視圖或其他東西)如果我將.observeOn轉移到鏈的開頭 - 第二次webService調用將會在主線程中執行(

因此,這裏的問題 - 怎樣才能「遊」,通過螺紋多次在RxJava鏈??

回答

2

Rx doc for SubscribeOn

的SubscribeOn操作人員指定哪個線程Ť無論操作員被調用的運營商鏈中的哪個點,他都將開始操作Observable。另一方面,Observable會影響Observable會在該操作符出現的地方使用的線程。因此,您可以在Observable運算符鏈中的多個時間點多次調用ObserveOn,以便更改某些操作符在哪些線程上運行。

SubscribeOn運算符只能應用一次並設置啓動線程。 ObserveOn可用於在流中的任意點從一個線程轉到另一個線程。所以我認爲以下應該做你想要的:

webService.requestGroups() 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .flatMap(group -> { 
     view.showGroup(group); 
     return webService.requestItems(group) 
         .subscribeOn(Schedulers.io()); 
    }) 
    .toList() 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(items -> view.showItems(items)); 

但在我看來這太複雜了。我只想訂閱第一個觀察對象,然後爲每個組啓動一個新鏈,如下所示:

webService.requestGroups() 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(group -> { 
     view.showGroup(group); 
     webService.requestItems(group) 
      .subscribeOn(Schedulers.io() 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(items -> view.showItems(items)); 
    });