如何解决处理后如何捕获 RxJava SubScription 流的错误?
我有以下代码
class MainActivity : AppCompatActivity() {
var disposable: Disposable = Disposables.disposed()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
disposable = Single.fromCallable {
Log.d("Trackme","process start")
disposable.dispose()
(0..1000).forEach {
if (it % 1000 == 0) Log.d("Trackme","process $it")
}
throw IllegalStateException("Kill Myself")
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
Log.d("Trackme","Done")
},{
Log.d("Trackme",it.localizedMessage)
})
Log.d("Trackme","finish subscribe")
}
}
在此代码中,我在订阅开始时明确disposable.dispose()
。
如果没有 throw IllegalStateException
,它将一直运行到完成。
D/Trackme: finish subscribe
D/Trackme: process start
D/Trackme: process 0
D/Trackme: process 1000
此后什么也没发生,这很好,因为进程已被处理。
但是,如果我有 throw IllegalStateException
,那么它会崩溃,因为 Error Lambda 无法再捕获它(因为它已被处理)。
我们如何捕获此错误?
解决方法
我找到了使用RxJavaPlugins.setErrorHandler
的解决方案,如下图
class MainActivity : AppCompatActivity() {
var disposable: Disposable = Disposables.disposed()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
RxJavaPlugins.setErrorHandler { e -> Log.d("Trackme","Catch App ${e.localizedMessage}") }
disposable = Single.fromCallable {
Log.d("Trackme","process start")
disposable.dispose()
(0..1000).forEach {
if (it % 1000 == 0) Log.d("Trackme","process $it")
}
throw IllegalStateException("Kill Myself")
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
Log.d("Trackme","Done")
},{
Log.d("Trackme",it.localizedMessage)
})
Log.d("Trackme","finish subscribe")
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。