2017-01-19 39 views
1

我有一個方法,應該使用多個observable將數據庫重新加載。畢竟它應該調用setupPlace(selecetedPlace)方法,但只能調用一次。每個observable都返回不同的對象(void,object,listOfObjects)。RxJava結合了多個可觀察事物做完所有完成

private void reloadDatabaseFromRest(final Place selectedPlace, final Event selectedEvent) throws ParseException { 
    Observable.concat(DatabaseManager.getInstance().clearDatabase(), 
      mPlaceUseCase.getPlacesListFromRestObservable() 
        .filter(places -> places != null && !places.isEmpty()) 
        .doOnNext(places -> mPlaceUseCase.savePlacesToRepository(places)), 
      mPlaceUseCase.saveSelectedPlace(selectedPlace), 
      mEventUseCase.getEvenListObservableFromRest(selectedPlace.getId()) 
        .doOnNext(eventList -> mEventUseCase.saveEventsToRepository(eventList)), 
      mEventUseCase.saveSelectedEventObservable(selectedEvent)) 
      .takeLast(1) 
      .subscribe(o -> mSplashScreenUI.setupPlace(selectedPlace)); 
} 

但是這種方法只對最後一個observable做subsribe(),而其他的則沒有被調用(對嗎?)。我嘗試使用過濾器,壓縮和愚蠢如果(o instanceOf ArrayList)子句,但它是錯誤的方式。有人能幫助我嗎?

+1

'concat'應該依次調用所有的觀察對象。 –

回答

4

您可以使用Completable類型。 Completable只是通知用戶流已完成。

將您需要訂閱的所有可觀察數據整理到Completable.fromObservable()的Completable中,然後將它們與Completable.merge()合併(並行開始),或者將它們串聯起來(依次串聯)與Completable.concat

注:確保所有觀測的你包裝成Completable會叫的onComplete等等都是不人流如潮。

0

非常感謝@koperko!它就像一個魅力,這正是我所需要的。 在重寫方法期間,我注意到第一個Observable發出6個項目(clearDatabase()),所以我將它包裝到Completable中並且它可以工作! ()我用flatMap():

private void reloadDatabaseFromRest(final Place selectedPlace, final Event selectedEvent) { 
    Completable.fromObservable(
      DatabaseManager.getInstance().clearDatabase() 
        .flatMap(aVoidDB -> mPlaceUseCase.getPlacesListFromRestObservable().filter(places -> places != null && !places.isEmpty())) 
        .flatMap(places -> mPlaceUseCase.savePlacesToRepository(places)) 
        .flatMap(aVoidPlace -> mPlaceUseCase.saveSelectedPlace(selectedPlace)) 
        .flatMap(aVoidSelectedPlace -> { 
         try { 
          return mEventUseCase.getEvenListObservableFromRest(selectedPlace.getId()); 
         } catch (ParseException e) { 
          Log.e(TAG, e.getMessage()); 
          return null; 
         } 
        }) 
        .filter(eventList -> eventList != null) 
        .flatMap(eventList -> mEventUseCase.saveEventsToRepository(eventList)) 
        .flatMap(aVoidEvents -> mEventUseCase.saveSelectedEventObservable(selectedEvent))) 
      .subscribe(() -> { 
       mSplashScreenUI.setupPlace(selectedPlace); 
      }); 
}