我有以下问题:
我需要获得一个<>请求使用Retrofit并将其与Flowable<>组合使用(房间)。一旦完成,我在UI上显示数据。我想从Room获得持续的更新。
我尝试使用zip操作符,因为这是一种常见的方法,但是zip的问题是它等待来自两个来源的数据 - 这意味着每次我从Room获取新数据时,zip都没有&# 39; t传播任何新的emmisions,因为它还需要来自Retrofit的新数据。
我目前的解决方案就是这个,使用combineLatest:
Flowable<UiModel> getData() {
return Flowable.combineLatest(networkService.getUsers().toFlowable(),
roomDao.getBooks(), UiModel::success)
.onErrorReturn(UiModel::error)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.startWith(UiModel.loading());
}
这有效,但有一些小问题。首先,有UiModel的多次发射。这可以通过combineLatest来实现 - 我得到第一个包含数据库数据的模型,然后是网络请求完成时的第二个模型。我知道我可以使用skip(1)运算符跳过第一次发射,但我尝试用本地缓存替换我的网络服务,当两个数据源在相同(相似的?)时间完成时,combineLatest似乎只发出一个UiModel。 / p>
有没有更好的方法来实现我想要的目标?
编辑:我在onErrorReturn之前添加了.distinctUntilChanged运算符。我认为这应该可以解决任何问题。
答案 0 :(得分:1)
如果您将订阅拆分为带Flowable的房间和网络电话怎么办?
在创建视图时从Room获取缓存数据,如果有数据可以将其显示给用户(带有一些时间戳以指示数据已缓存)
同时向网络发出请求(这个可以留在后台线程)并让您的网络服务将返回的数据插入到表中。如果数据不同,它将更新条目,Flowable将发出,如果数据相同,则表格不会更新且Flowable不会发出。
拆分的原因是可以更好地控制可观察流,其中一个只发出一次,另一个只在每次发生变化时发出。