Rx + Retrofit + Room - 结合单人和流动

时间:2017-12-28 19:06:16

标签: retrofit2 rx-java2 rx-android android-room

我有以下问题:

我需要获得一个<>请求使用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运算符。我认为这应该可以解决任何问题。

1 个答案:

答案 0 :(得分:1)

如果您将订阅拆分为带Flowable的房间和网络电话怎么办?

在创建视图时从Room获取缓存数据,如果有数据可以将其显示给用户(带有一些时间戳以指示数据已缓存)

同时向网络发出请求(这个可以留在后台线程)并让您的网络服务将返回的数据插入到表中。如果数据不同,它将更新条目,Flowable将发出,如果数据相同,则表格不会更新且Flowable不会发出。

拆分的原因是可以更好地控制可观察流,其中一个只发出一次,另一个只在每次发生变化时发出。