[英]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.