Android - 来自多个来源的数据
问题描述:
我使用retrofit,rxjava和realm构建应用程序。这就是我要完成的:Android - 来自多个来源的数据
- 加载数据从本地数据库,并在同一时间发出网络请求
- 第一次显示一个载入只有
- 如果数据已经存在于数据库显示它与在某处显示小型装载程序
- 当网络结果准备就绪时,更新列表并将结果保存到磁盘
- 如果网络结果失败,则显示一条消息,指出数据可能已过时。
我知道如何使用领域,适当改造,但它的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 -> {
});
答
在同一时间,你可以使用调用这两个函数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
我怎么知道,网络仍在加载?我想在从磁盘加载列表后显示加载程序。 – Prasanth