RxJava在数据库为空时调用网络
我正在使用RxJava、Room和改装来完成Android中的存储库模式。除了这件事,一切都在运转。我已经实现了搜索数据的RxJava在数据库为空时调用网络,java,android,rx-java2,Java,Android,Rx Java2,我正在使用RxJava、Room和改装来完成Android中的存储库模式。除了这件事,一切都在运转。我已经实现了搜索数据的SearchView。现在,当搜索视图文本更改时,我调用搜索方法。下面是它的样子 mLocal.searchMovies(query) //returns Single mRemote.searchMovies(query) //returns Single public Single<List<MovieEntity>> search(String
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.searchMovies(查询)//返回单个
mRemote.searchMovies(query)//返回单个
公共单一搜索(字符串查询){
返回mLocal.searchMovies(查询)
.toMaybe()
.switchIfEmpty(mRemote.searchMovies(查询)
.map(数据->{
本地保存所有(数据);
返回数据;
}));
}
mLocal
查询房间数据库,并mRemote
调用reformation从RESTAPI获取数据。问题是,这只调用mLocal,当房间返回空行时,不会启动网络调用。我已经尝试了我可能的一切,读了很多文章,但我不明白如何让它工作
mLocal和mRemote都可以正常工作。只有链接它们并不能达到我想要的效果。您的链接不起作用,因为
中的.toMaybe()
无法生成Maybe.empty()
,这是生效所需的结果
您需要将其替换为Single.onErrorResume
,以使丢失条目的错误条件导致远程查询,或者使其返回Maybe
,以准确表示的三态。我的问题的解释与中的相同。我将复制相关部分,并在应用后发布我的工作代码
注:我已从单一/可能更改为可流动。我不确定它对原始代码的影响有多大,如果我没有改变可观察对象的类型
根据OP的反馈,allDatas源是无限的,但是
返回了一个空列表。该决议至少适用于第(1)条
从所有数据中只获取一个响应,然后选择筛选
退出空列表,以便switchIfEmpty可以切换到
替代品
public-Flowable-getMovies(){
返回mLocal.allMovies().take(1)
.filter(list->!list.isEmpty())
.switchIfEmpty(mRemote.allMovies()
.doOnNext(数据->本地.saveAll(数据))
);
}
public Flowable<List<MovieEntity>> getMovies() {
return mLocal.allMovies().take(1)
.filter(list -> !list.isEmpty())
.switchIfEmpty(mRemote.allMovies()
.doOnNext(data -> mLocal.saveAll(data))
);
}