为了账号安全,请及时绑定邮箱和手机立即绑定

使用 retryWhen() 重试 observable

使用 retryWhen() 重试 observable

繁花如伊 2021-07-06 17:43:58
我正在实现一个可观察的对象,它会在 5 秒的延迟后重试错误。我正在使用改造进行网络连接。我面临的问题是当 API 返回错误时有很多重试。我只想在 5 秒后重试,但重试速度非常快(几乎每秒 3 次)。知道为什么吗?userAPI.getUsers()       .filter { it.users.isNotEmpty() }       .subscribeOn(Schedulers.io())       .retryWhen { errors -> errors.flatMap { errors.delay(5, TimeUnit.SECONDS) } }       .observeOn(AndroidSchedulers.mainThread())       .subscribe({}, {})其中userAPI.getUsers()返回一个可观察的。疯狂数量的 API 请求:08-13 12:31:31.308 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo08-13 12:31:31.825 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo08-13 12:31:32.370 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo08-13 12:31:32.897 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo08-13 12:31:33.436 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo08-13 12:31:33.952 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo08-13 12:31:34.477 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo08-13 12:31:35.020 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo08-13 12:31:35.609 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo08-13 12:31:36.205 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/fooPS:我已经阅读了 Dan lew 关于 retryWhen 和 repeatWhen 的博客文章。
查看完整描述

2 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

请再次查看 Dan Lew 的博客文章,他在“使用”标题下实际描述了您的用例的解决方案。

source.retryWhen(errors -> errors.flatMap(error -> Observable.timer(5, TimeUnit.SECONDS)))

解释:

请注意Observable.delayObservable.timerasObservable.delay的文档说明之间的区别

来自源 Observable 的错误通知不会延迟。

在 retryWhen 您的errorsObservable 立即订阅(因为Observable.delay仅延迟 onNext)然后源再次出错并立即发出错误,这会触发 retryWhen 并且您进入递归循环。


查看完整回答
反对 回复 2021-07-14
  • 2 回答
  • 0 关注
  • 276 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信