Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用retryWhen()重试可观察对象_Java_Android_Rx Java_Observable_Rx Java2 - Fatal编程技术网

Java 使用retryWhen()重试可观察对象

Java 使用retryWhen()重试可观察对象,java,android,rx-java,observable,rx-java2,Java,Android,Rx Java,Observable,Rx Java2,我正在实现一个可观察的,在延迟5秒后重试错误。我正在使用网络改造。我面临的问题是,当API返回错误时,会有很多次重试。我只想在5秒后重试,但是重试的速度非常快(几乎一秒钟三次)。知道为什么吗 userAPI.getUsers() .filter { it.users.isNotEmpty() } .subscribeOn(Schedulers.io()) .retryWhen { errors -> errors.flatMap { errors.

我正在实现一个可观察的,在延迟5秒后重试错误。我正在使用网络改造。我面临的问题是,当API返回错误时,会有很多次重试。我只想在5秒后重试,但是重试的速度非常快(几乎一秒钟三次)。知道为什么吗

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

注:我已经浏览了Dan lew关于retryWhen和repeatWhen的博文。

问题似乎在于你的flatmap函数lambda,即

.retryWhen({ errors -> errors.flatMap { errors.delay(5, TimeUnit.SECONDS) } })
(我认为缺少括号是一种打字错误)。结果是,传递给retryWhen的可观察对象立即终止,从而在出现错误时导致“疯狂”的重试率

试一试


问题似乎出在flatmap函数lambda中,即

.retryWhen({ errors -> errors.flatMap { errors.delay(5, TimeUnit.SECONDS) } })
(我认为缺少括号是一种打字错误)。结果是,传递给retryWhen的可观察对象立即终止,从而在出现错误时导致“疯狂”的重试率

试一试


请再次查看Dan Lew的博客文章,他在Uses标题下为您的用例描述了一个解决方案

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

说明:

请注意
可观察到的延迟
可观察到的计时器
之间的区别,因为
可观察到延迟
的文档说明

来自源可观察对象的错误通知不会延迟


在Retry中,当您的
错误
可观察立即订阅时(作为
可观察。延迟
仅延迟onNext),然后源错误再次出现并立即发出错误,这将触发retryWhen,您将进入递归循环

请再次查看Dan Lew的博客文章,他在文章的Uses标题下为您的用例描述了一个解决方案

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

说明:

请注意
可观察到的延迟
可观察到的计时器
之间的区别,因为
可观察到延迟
的文档说明

来自源可观察对象的错误通知不会延迟


在Retry中,当您的
错误
可观察立即订阅时(作为
可观察。延迟
仅延迟onNext),然后源错误再次出现并立即发出错误,这将触发retryWhen,您将进入递归循环

为什么会这样?“试试这个”答案通常没有真正的帮助,除非你解释什么是不同的,以及原始帖子没有正确执行
flatMap()
的原因。用@johnowus所描述的方式修复这个错误会使问题消失。为什么会这样呢?“试试这个”答案通常没有真正的帮助,除非你解释什么是不同的,以及原始帖子没有正确执行
flatMap()
的原因。以@johnwows描述的方式修复该错误应该可以解决问题。