2015-07-12 95 views
6

我有一個Observable誰從數據庫中讀取數據。如果數據是null我需要從網絡中獲取它。所以我做flatMap第一Observable,檢查數據庫操作的結果,如果它是null我開始另一個Observable從網絡中獲取數據。如何在flatMap()中等待Observable的onComplete()

注:Observable■找不同Subscriber因爲我根據其中數據來自(例如邏輯)具有不同的後處理。

Observable.just(readDataFromDb()).flatMap(new Func1<SomeData, Observable<String>>() { 
     @Override public Observable<SomeData> call(SomeData s) { 
      if (s == null) { 
      getReadFromNetworkObservable().subscribe(new AnotherSubscriber()); // this one might not complete 
      return Observable.empty(); // I think I need to send this one only after readFromNetwork() completed 
      } else { 
      return Observable.just(s); 
      } 
     } 
     }).subscribe(new SomeSubscirber()); 

鑑於我送Observable.empty()排除數據處理SomeSubscriber,我有預感我的第二個Observable可以,因爲它可能被簡單地作爲垃圾回收並不總是完成。我想我在測試中看到了它。

在這一點上,我想我只需要等到Observable誰從網絡讀取完成,然後發送Observable.empty()。那麼我可以讓執行同步嗎?但是我仍然覺得我做錯了。

+1

檢查這回答https://stackoverflow.com/questions/26939175/rxjava-and-cached-data和這個博客http://blog.danlew.net/2015/06/22/loading-data-from-multiple-sources-with -rxjava /。還要檢查RxJava中的'doOnNext'運算符以獲得一些想法。 –

+0

你可以看看我的問題,我發現了幾個選項來組合來自多個來源的數據。通過社區幫助,我們爲這個用例獲得最強大的版本。 http://stackoverflow.com/questions/40797144/andorid-rxjava-how-to-get-data-from-cache-and-the-same-time-update-it-in-th – Gleichmut

回答

7

你可以讓任何可觀察到與.toBlocking快捷阻塞(查看完整的信息https://github.com/ReactiveX/RxJava/wiki/Blocking-Observable-Operators

Data d = getReadFromNetworkObservable() 
      .toBlocking() 
      .first() // or single() or singleOrDefault() 

// manipulate with data here 

相結合的網絡數據緩存這裏描述:http://blog.danlew.net/2015/06/22/loading-data-from-multiple-sources-with-rxjava/

在這裏:RxJava and Cached Data

+0

有什麼區別那兩個? – Eugene

+0

它們與說明一個觀點相同:「AnotherSubscriber」或它下面的行可能比readDataFromNetwork返回一個數據結果更早調用。 –

+0

我明白了。我剛剛意識到我添加了'just()'操作符的混淆。它實際上只是一個「觀察者」。我更新了一個問題。 – Eugene