2017-05-31 191 views
0

我使用retrofit,rxjava和realm構建應用程序。這就是我要完成的:Android - 來自多個來源的數據

  1. 加載數據從本地數據庫,並在同一時間發出網絡請求
  2. 第一次顯示一個載入只有
  3. 如果數據已經存在於數據庫顯示它與在某處顯示小型裝載程序
  4. 當網絡結果準備就緒時,更新列表並將結果保存到磁盤
  5. 如果網絡結果失敗,則顯示一條消息,指出數據可能已過時。

我知道如何使用領域,適當改造,但它的rxjava部分是令人困惑。有沒有一種簡單的方法來與rxjava做到這一點?

這是當前的代碼庫的樣子:

CategoryRepository.java

public Observable<List<Category>> getCategories() { 
    return getCategoriesFromNetwork() 
      .observeOn(Schedulers.computation()) 
      .doOnNext(this::saveCategoriesToDisk) 
      .publish(nwResponse -> Observable.merge(nwResponse, getCategoriesFromDisk().takeUntil(nwResponse))); 

} 



private Observable<List<Category>> getCategoriesFromNetwork() { 
     return service.getCategories() 
       .map(categoryListResponse -> categoryListResponse.getData()); 
} 


private Observable<List<Category>> getCategoriesFromDisk() { 
     return Observable.just(realm.copyFromRealm(
        realm.where(Category.class).findAll() 
       )); 
} 

視圖模型

categoryRepository.getCategories() 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(categories -> { 
        //Do UI stuff 
       }, throwable -> { 
}); 

回答

0

在同一時間,你可以使用調用這兩個函數Zip運營商或combineLatest歌劇TOR。他們本質上是相同的,我認爲不同之處在於zip繼續你需要兩個新的observables,而對於combine最新的你只需要一個新的observable來繼續lambda。

做點什麼榜單:

public Observable<List<Category>> getCategories() { 
return Observable.combineLatest(getCategoriesFromNetwork(), getCategoriesFromDisk(), (categoriesFromNet, categoriesFromDisk) -> { 
    categoriesFromNet.addAll(categoriesFromDisk); 
    return categoriesFromNet; 
}) // now you have a complete list of your categories to do with what you want 
+0

我怎麼知道,網絡仍在加載?我想在從磁盤加載列表後顯示加載程序。 – Prasanth