2017-01-19 2 views
1

複数の観測値を使用してDBをリロードする方法があります。結局のところ、メソッドsetupPlace(selecetedPlace)を呼び出す必要があります。各オブザーバブルは、異なるオブジェクト(void、object、listOfObjects)を返します。RxJavaは、すべての処理が完了した後にsthを実行します。

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)); 
} 

しかし、この方法は、(subsribeを行っているが)最後に観察し、他人に(私は右だ?)が呼び出されていません。私はフィルターを使用して、zipと愚かなif(instanceOf ArrayList)節を作成しようとしましたが、それは間違った方法です。誰か助けてくれますか?

+1

'concat'順に、すべての観測を呼び出すべきです。 –

答えて

4

Completableタイプを使用できます。 Completableは、ストリームが終了したことを加入者に通知するだけです。

Completable.fromObservable()でCompletableにサブスクライブし、次にCompletable.merge()とマージ(並行して開始)するか、または連続してconcat()を連結する必要があります。

注:あなたがCompletableにラップ観測のすべてがonCompleteのを呼び出しますので、無限ストリームがないことを確認してください。

0

ありがとうございます@コペコ!それは魅力のように機能し、これはまさに私が必要としていたものです。 書き換えメソッドの中で、最初に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); 
      }); 
} 
関連する問題