猿问

使用 retryWhen() 重试 observable

我正在实现一个可观察的对象,它会在 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/foo

08-13 12:31:31.825 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo

08-13 12:31:32.370 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo

08-13 12:31:32.897 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo

08-13 12:31:33.436 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo

08-13 12:31:33.952 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo

08-13 12:31:34.477 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo

08-13 12:31:35.020 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo

08-13 12:31:35.609 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo

08-13 12:31:36.205 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo

PS:我已经阅读了 Dan lew 关于 retryWhen 和 repeatWhen 的博客文章。


繁花如伊
浏览 277回答 2
2回答

四季花海

请再次查看 Dan Lew 的博客文章,他在“使用”标题下实际描述了您的用例的解决方案。source.retryWhen(errors -> errors.flatMap(error -> Observable.timer(5, TimeUnit.SECONDS)))解释:请注意Observable.delay和Observable.timerasObservable.delay的文档说明之间的区别来自源 Observable 的错误通知不会延迟。在 retryWhen 您的errorsObservable 立即订阅(因为Observable.delay仅延迟 onNext)然后源再次出错并立即发出错误,这会触发 retryWhen 并且您进入递归循环。
随时随地看视频慕课网APP

相关分类

Java
我要回答