1、前言
今天通过这篇文章你将学习到以下内容,将在译者思考部分会给出相应的答案
just 和 fromCallable 区别?
什么是 RxJavaPlugins.setErrorHandler?
Crashes 发生在 just() 中的处理方案?
Crashes 发生在 subscribe success 中的处理方案?
Crashes 发生在 subscribe error 中的处理方案?
Crashes 发生在 complete 中的处理方案?
Crashes 发生在 complete 之前的处理方案?
这篇文章涉及很多重要的知识点,请耐心读下去,应该可以从中学到很多技巧。
2、译文
大部分了解 RxJava 的人都会喜欢它,因为它能够封装 onError 回调上的错误处理,如下所示:
Single.just(getSomeData())
.map { item -> handleMap(item) }
.subscribe(
{ result -> handleResult(result) },
{ error -> handleError(error) } // Expect all error capture
)
你可能会以为所有的 Crashes 都将调用 handleError 来处理,但其实并全都是这样的。
Crashes 发生在 just() 中
我先来看一个简单的例子,假设 crashes 发生在 getSomeData() 方法内部
Single.just(getSomeData() /**🔥Crash🔥**/ )
.map { item -> handleMap(item) }
.subscribe(
{ result -> handleResult(result) },
{ error -> handleError(error) } // Crash NOT caught ⛔️
这个错误将不会在 handleError 中捕获,因为 just() 不是 RxJava 调用链的一部分,如果你想捕获它,你可能需要在最外层添加 try-catch 来处理,如下所示:
try {
Single.just(getSomeData() /**🔥Crash🔥**/ )
.map { item -> handleMap(item) }
.subscribe(
{ result -> handleResult(result) },
{ error -> handleError(error) } // Crash NOT caught ⛔️
)
} catch (exception: Exception) {
handleError(exception) // Crash caught ✅
}
如果你不使用 just ,而是使用 RxJava 内部的一些东西,例如 fromCallable,错误将会被捕获
Single.fromCallable{ getSomeData() /**🔥Crash🔥**/ }
.map { item -> handleMap(item) }
.subscribe(
{ result -> handleResult(result) },
{ error -> handleError(error) } // Crash caught ✅
)
Crashes 发生在 subscribe success 中
让我们来假设一下 Crashes 出现在 subscribe success 中,如下所示
Single.just(getSomeData() )
.map { item -> handleMap(item) }
.subscribe(
{ result -> handleResult(result) /**🔥Crash🔥**/ },
{ error -> handleError(error) } // Crash NOT caught ⛔️
)
这个错误将不会