用于RxJava 2的onErrorInsertItem?高级接收缓存逻辑

时间:2018-08-16 09:21:02

标签: java android caching rx-java2

我正在使用RxJava 2进行缓存实现。我需要的是,当网络请求失败时,我的存储库将插入陈旧数据并显示错误消息。虽然我可以使用.onErrorReturnItem(cachedItem)插入Item,但错误却丢失了。另外,我还可以将缓存的数据与网络请求合并,但这有点麻烦:

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
}

是否可以将.onErrorReturnItem(cachedDashboard)修改为类似的内容?:enter image description here

1 个答案:

答案 0 :(得分:0)

感谢@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);
    }
}