我正在实现一个可观察的对象,它会在 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.delay
和Observable.timer
asObservable.delay
的文档说明之间的区别
来自源 Observable 的错误通知不会延迟。
在 retryWhen 您的errors
Observable 立即订阅(因为Observable.delay
仅延迟 onNext)然后源再次出错并立即发出错误,这会触发 retryWhen 并且您进入递归循环。
添加回答
举报
0/150
提交
取消