2017-05-31 127 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