我使用RxJava,Room和Retrofit在Android中完成Repository模式。除了这一件事,一切都在发挥作用。我已经实现了SearchView
来搜索数据。现在,当搜索视图文本发生变化时,我称之为搜索这是它的样子
mLocal.searchMovies(query) //returns Single
mRemote.searchMovies(query) //returns Single
public Single<List<MovieEntity>> search(String query) {
return mLocal.searchMovies(query)
.toMaybe().switchIfEmpty(mRemote.searchMovies(query)
.map(data -> {
mLocal.saveAll(data);
return data;
}));
}
mLocal
查询会议室数据库和mRemote
调用改进以从REST API获取数据。问题是,这只调用mLocal,当房间返回空行时,网络调用没有启动。我尽我所能尝试了很多文章,但我无法理解如何让它发挥作用。
mLocal和mRemote中的每一个都可以正常工作。只有链接它们才能达到我想要的效果。
答案 0 :(得分:1)
您的链条不起作用,因为.toMaybe()
中的Single
无法生成Maybe.empty()
,这是.switchIfEmpty
生效所需的结果。
您需要将其替换为Single.onErrorResume
,以便错过条目的错误条件会导致远程查询,或者让它返回Maybe
以准确表示<Result,NotCached,Error>
的三态
答案 1 :(得分:0)
我的问题的解释与this answer中的相同。我将复制相关部分并在应用后发布我的工作代码。
注意:我从Single / MayBe更改为Flowable。我不确定它对原始代码有多大影响,我没有改变Observables的类型。
根据OP的反馈,allDatas源是无限的但是 返回一个空列表。该决议至少适用于(1) 从allDatas获得一个响应,然后选择性地过滤 出空列表所以switchIfEmpty可以切换到 替代
public Flowable<List<MovieEntity>> getMovies() {
return mLocal.allMovies().take(1)
.filter(list -> !list.isEmpty())
.switchIfEmpty(mRemote.allMovies()
.doOnNext(data -> mLocal.saveAll(data))
);
}