java - RxJava 2 的 onErrorInsertItem?高级 rx 缓存逻辑
问题描述
我正在使用 RxJava 2 实现缓存。我需要的是当网络请求失败时,我的存储库将插入陈旧数据并显示错误消息。虽然我能够插入有.onErrorReturnItem(cachedItem)
错误的项目但丢失了。我还可以将缓存的数据与网络请求连接起来,但这有点麻烦:
public Observable<Dashboard> getDashboard(String phoneNum, boolean getNewData) {
if (getNewData) invalidateDashboardCache();//just set dashboardCacheValid = false
Observable<Dashboard> observableToCache = Observable.fromCallable(
() -> {
Dashboard cached = mCache.getDashboard(phoneNum);
if (cached != null) {
if (!cached.cacheValid()) {
dashboardCacheValid = false;
}
return cached;
}
dashboardCacheValid = false;
return Dashboard.EMPTY;
})
.concatMap(cachedDashboard -> Observable.concat(Observable.just(cachedDashboard),
Observable.fromCallable(() -> !dashboardCacheValid)
.filter(Boolean::booleanValue)
.flatMap(cacheNotValid -> mNetworkHelper.getDashboardRaw(phoneNum))
.doOnNext(dashboard -> {
mCache.putDashboard(pnumber, dashboard);
dashboardCacheValid = true;
})));
return cacheObservable(CACHE_PREFIX_GET_DASHBOARD + phoneNum, observableToCache); //this is for multiple calls
}
解决方案
感谢@akarnokd,我能够使用更简洁的代码正确解决它:
public Observable<Dashboard> getDashboardNew(String phoneNum, boolean getNewData) {
Dashboard fromCache = mCache.getDashboard(phoneNum, getNewData);
dashboardCacheValid = fromCache.cacheValid();
if (getNewData) invalidateDashboardCache();
if (dashboardCacheValid) {
return Observable.just(fromCache);
} else {
final Dashboard cached = fromCache;
Observable<Dashboard> observableToCache = mNetworkHelper.getDashboardRaw(phoneNum)
.doOnNext(dashboard -> mCache.putDashboard(phoneNum, dashboard))
.onErrorResumeNext(throwable -> {
return Observable.concat(Observable.just(cached), Observable.error(throwable));
});
return cacheObservable(CACHE_PREFIX_GET_DASHBOARD + phoneNum, observableToCache);
}
}
推荐阅读
- git - 如何将 GIT 与 Pega 一起使用?
- angular - 错误:找不到“object”类型的不同支持对象“[object Object]”
- javascript - 如何显示特定类别的所有帖子
- r - 根据条件获取上个月的平均值
- reactjs - 传递给子函数的函数被解释为字符串
- c# - PdfDocumentOpenMode.Import - 导入 pdf 的问题
- algorithm - 基于特定标准在多维数组中寻找最佳组合的算法
- google-chrome - 如何检测到设备更改为笔记本电脑上未插入的耳机 - chrome
- javascript - web 如何使用worker从api调用和获取数据?
- excel - 将数据从 3 个工作簿复制到 1 个主工作簿