2017-01-19 38 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); 
      }); 
}