当数据库为空时,RxJava调用网络

时间:2018-06-14 14:29:53

标签: java android rx-java2

我使用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中的每一个都可以正常工作。只有链接它们才能达到我想要的效果。

2 个答案:

答案 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))
                        );
    }