首页 > 解决方案 > 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
}

有没有办法修改.onErrorReturnItem(cachedDashboard)成这样的东西?:在此处输入图像描述

标签: javaandroidcachingrx-java2

解决方案


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

推荐阅读