gpt4 book ai didi

java - RxJava + 改造 + 轮询

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:31:16 25 4
gpt4 key购买 nike

我有一个 Retrofit 调用,想每 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 错误?

最佳答案

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

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

使用 Rx 真的很简单 :) 我不会给你最终的解决方案,只是尝试一下并尝试理解这里的流程。

关于java - RxJava + 改造 + 轮询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37160216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com