android - 如果在后台订阅,为什么 retryWhen 会隐藏处理程序的错误?
问题描述
我得到了retryWhen
在服务器错误的情况下执行某些请求所需的用法。通过这样的合成代码简化了这一点:
fun main(args: Array<String>) {
Single.error<Int>(Exception("Source"))
.retryWhen {
it.flatMapSingle {
Single
.error<Unit>(Exception("Handler"))
.subscribeOn(Schedulers.computation())
//.observeOn(AndroidSchedulers.mainThread())
.doOnError { handlerError -> handlerError.printStackTrace() }
}
}
.subscribe({ println("success") },
{
println("source error")
it.printStackTrace()
})
}
这里源产生错误,然后应该retryWhen
在处理程序的请求完成时重新订阅它。
但是处理程序发生错误!然后retryWhen
被设计为不抛出源链并将错误状态处理为“不重试”。但是无论retryWhen
处理程序期望输出doOnError
并且什么都没有,处理程序错误都被隐藏了。
在 Java 上:
- 如果不更改调度程序,错误将发送到源链
subscribeOn
- 否。 - 错误被隐藏
doOnError
-如果订阅计算则不调用。
在安卓上:
- 如果不更改调度程序,也会将错误发送到源链
subscribeOn
- 不。 - 如果订阅了计算,则隐藏,无论是否在 main 上观察到
为什么doOnError
在后台运行时不处理?
如果不更改调度程序,为什么retryWhen
不吞下错误?
解决方案
推荐阅读
- azure - Azure Active Directory 并发用户(相同凭据)登录
- python-3.x - 如何添加一行或一些符号,如 (&&&&&) 以使用 Python 将输出与文本文件分开?
- amazon-web-services - 如何将 AD FS 组成员身份映射到自定义 AWS Cognito 属性?
- ios - json 解析不正确
- ruby - 为什么这个 Jekyll 插件会抛出异常?
- android - UserHandle.CURRENT_OR_SELF 无法解析或不是字段(Eclipse)
- c - 直接从 rpi 2b 上的寄存器读取 GPIO 端口的 C 代码
- firebase - 如何修复 ContinueWith 方法中的“只能从主线程调用”
- python - 如何使用 Selenium 和 Python 单击动态按钮
- javascript - 如何阻止我的搜索功能检查大小写(大写/小写) - Javascript/ReactJS