RxJava + 改造 + 轮询

2022-09-04 03:59:02

我有一个改造电话,想每30秒回忆一次。为此,我使用Observable.interval(0, 30, TimeUnit.SECONDS)

Observable
    .interval(0, 30, TimeUnit.SECONDS)
    .flatMap(x -> RestApi.instance().getUsers())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(list -> {
                    // ...
               },
               error -> Timber.e(error, "can't load users"));

我的问题:如果api调用失败,则调用订阅并取消订阅并且轮询不再工作:-(onError

为了捕获api错误,我添加了一个retryWhen

Observable
    .interval(0, 30, TimeUnit.SECONDS)
    .flatMap(x -> RestApi.instance().getUsers()
                         .retryWhen(errors -> errors
                             .flatMap(error -> Observable.timer(15, TimeUnit.SECONDS))))
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(list -> {
                   // ...
               },
               error -> Timber.e(error, "can't load users"));

这会捕获错误,但随着时间的推移,我收到了多个 api 调用。每30秒,我就会得到一个新的轮询信号,该信号以新的api请求结束。但是,如果 api 请求失败,它会自行重试。所以我有一个新的请求加上所有重试。

我的问题:如何在不取消订阅投票信号的情况下处理API错误?


答案 1

阅读如何正确使用 和 。http://blog.danlew.net/2016/01/25/rxjavas-repeatwhen-and-retrywhen-explained/retryWhenrepeatWhen

以及如何使用运算符:http://blog.danlew.net/2015/12/08/error-handling-in-rxjava/onError

这真的很容易 w Rx :)我不打算给你一个最终的解决方案,只是玩一玩,试着理解这里的流程。


答案 2

如果您希望您的请求在请求失败时不会结束,而不是返回 ,请使其返回 .这样,您就可以拦截对象中的网络错误。getUsersonErrorObservable<yourUserType> getUsers()Observable<Response<yourUserType>> getUsers()Response

仅当使用改造 2.x 时,此方法才有效


推荐