首页 > 解决方案 > 当请求获取远程数据时出现错误时,RxJava2 concatArrayEagerDelayError 不会加载缓存数据

问题描述

我在 Android 项目中使用以下代码从数据库(缓存)和 API 请求中加载数据:

Observable.concatArrayEagerDelayError(
    getDatabaseData(),
    getRemoteData()
).debounce(400, TimeUnit.MILLISECONDS)

getDatabaseData()getRemoteData()都返回Observable<MyObj>

它看起来像预期的那样工作,除非在尝试获取远程数据时发生错误。在订阅者上,我只收到 onError 回调,因此无法处理和显示缓存的数据。

我尝试更改为concatArrayand concat,但它有同样的问题。

这个问题有什么可能的解决方案吗?

标签: androidkotlinretrofit2rx-java2android-room

解决方案


问题是错误会推出数据库值,debounce因此它永远不会被传递。如果一个人实现了流程,那么错误通知也会做同样的事情。

我能想到的最好的办法是将错误转移到去抖动计时器之外,这样你至少会得到后续的项目:

Observable.concatArrayEagerDelayError(
        Observable.just(1).delay(100, TimeUnit.MILLISECONDS),
        Observable.<Integer>error(new IOException()).delay(200, TimeUnit.MILLISECONDS, true)
)
.onErrorResumeNext((Function<Throwable, Observable<Integer>>)(error -> 
     Observable.<Integer>error(error).delay(500, TimeUnit.MILLISECONDS, true))
)
.doOnEach(System.out::println)
.debounce(400, TimeUnit.MILLISECONDS)
.blockingSubscribe(
        System.out::println,
        Throwable::printStackTrace
);

推荐阅读