簡體   English   中英

數據庫為空時RxJava調用網絡

[英]RxJava call the network when database is empty

我正在使用RxJava,Room和Retrofit在Android中完成存儲庫模式。 除了這一件事,一切都在工作。 我已經實現了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都可以正常工作。 僅鏈接它們並不能實現我想要的功能。

您鏈不工作,因為.toMaybe()Single不能產生Maybe.empty()這是有要求的結果.switchIfEmpty生效。

您可能需要用Single.onErrorResume替換它,以便缺少條目的錯誤條件導致遠程查詢,或者使其返回Maybe以准確表示<Result,NotCached,Error>的三態。

我的問題的解釋與此答案相同。 應用后,我將復制相關部分並發布我的工作代碼段。

注意:我從Single / MayBe更改為Flowable。 不知道它對原始代碼有多大影響,是否沒有更改Observables的類型。

根據OP的反饋,allDatas源是無限的,但返回了一個空的List。 解決方案是至少應用take(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))
                        );
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM