如何在 Android 上通过 RxJava 中的平面图发送自定义 throwable?
How to send a custom throwable down through flatmap in RxJava on Android?
所以我在 RxJava 中使用 flatMap 链接一些 API 调用 return Singles 并且想知道如何根据我自己的条件将自定义 throwable 传递给 flatmap 方法中的 subscribe 方法.
这是一个 Android Kotlin 应用程序,它使用 MVVM 和 RxJava2/RxAndroid 进行数据操作。我正在尝试使用 flatmap 方法将 API 调用 return Singles 链接在一起。每次,我想在前一个方法之后调用一个新的 API 方法,我想检查前一个调用的响应是否成功。如果前一个调用的响应成功,我只需调用 flatmap 中的下一个 API 方法,一切都很好,但如果前一个调用的响应不成功,我想传递一个自定义 throwable 告诉我在哪里以及为什么手术没有成功。现在,在响应不成功的情况下,我传递了一个带有空值的 Single,但这只是在订阅时给我一个空指针,这不是很有帮助。
dataManager.apiCall1(dataManager.sessionId!!)
.subscribeOn(schedulerProvider.io())
.observeOn(schedulerProvider.ui())
.flatMap{apiCall1Response ->
if (apiCall1Response.isSuccessful && apiCall1Response.body() != null) {
// First api call was successful, execute api call 2.
return@flatMap dataManager.apiCall2(apiCall1Response.importantVal)
} else {
// First api call failed
Single.just(null)
}
}.flatMap{apiCall2Response ->
if (apiCall2Response != null && apiCall2Response.isSuccessful && apiCall2Response.body() != null) {
// Second api call was successful, execute api call 3.
return@flatMap dataManager.apiCall3(apiCall2Response.importantVal)
} else {
// Second api call failed
Single.just(null)
}
}.subscribe({apiCall3Response ->
if (apiCall3Response != null && apiCall3Response.body() != null) {
// Success!
navigator!!.successful(response)
} else {
// Third api call failed, handle error
navigator!!.handleError(Throwable("Api call 3 failed."))
}
}, {throwable ->
// Failure, this is where I want to receive a custom throwable
// in case one of the responses were unsuccessful.
navigator!!.handleError(throwable)
})
我希望可抛出的消息类似于 "apiCall1" 失败,但是当 apiCall1 失败时可抛出的消息只是 NullPointer,因为我传递了 Single.just(null)。
使用此代码
从 flatMap 中抛出 NullPointerException
并通过以下方式捕获错误
.onErrorReturn(throwable -> {//你的工作在这里})
@Carson J.
使用 Single.error()
而不是 Single.just(null)
。
例如:Single.error<TypeHere>(RuntimeException("First api call failed"))
为了最易读的代码,像这样定义一个扩展函数
private fun <T> Single<Response<T>>.decorateWithErrorHandling(): Single<T> {
return this
.onErrorResumeNext { throwable ->
// Map network layer exceptions, e.g. IOException to your specific "domain level" exceptions
Single.error(mapNetworkErrorToSpecificThrowable(throwable))
}
.flatMap { response ->
if (response.isSuccessful) {
Single.just(response.body())
} else {
Single.error(convertToSpecificThrowable(response))
}
}
}
这样使用:
apiCall1()
.composeWithErrorHandling().flatMap { result1 -> apiCall2(result1) }
.composeWithErrorHandling().flatMap { result2 -> apiCall3(result2) }
等等
所以我在 RxJava 中使用 flatMap 链接一些 API 调用 return Singles 并且想知道如何根据我自己的条件将自定义 throwable 传递给 flatmap 方法中的 subscribe 方法.
这是一个 Android Kotlin 应用程序,它使用 MVVM 和 RxJava2/RxAndroid 进行数据操作。我正在尝试使用 flatmap 方法将 API 调用 return Singles 链接在一起。每次,我想在前一个方法之后调用一个新的 API 方法,我想检查前一个调用的响应是否成功。如果前一个调用的响应成功,我只需调用 flatmap 中的下一个 API 方法,一切都很好,但如果前一个调用的响应不成功,我想传递一个自定义 throwable 告诉我在哪里以及为什么手术没有成功。现在,在响应不成功的情况下,我传递了一个带有空值的 Single,但这只是在订阅时给我一个空指针,这不是很有帮助。
dataManager.apiCall1(dataManager.sessionId!!)
.subscribeOn(schedulerProvider.io())
.observeOn(schedulerProvider.ui())
.flatMap{apiCall1Response ->
if (apiCall1Response.isSuccessful && apiCall1Response.body() != null) {
// First api call was successful, execute api call 2.
return@flatMap dataManager.apiCall2(apiCall1Response.importantVal)
} else {
// First api call failed
Single.just(null)
}
}.flatMap{apiCall2Response ->
if (apiCall2Response != null && apiCall2Response.isSuccessful && apiCall2Response.body() != null) {
// Second api call was successful, execute api call 3.
return@flatMap dataManager.apiCall3(apiCall2Response.importantVal)
} else {
// Second api call failed
Single.just(null)
}
}.subscribe({apiCall3Response ->
if (apiCall3Response != null && apiCall3Response.body() != null) {
// Success!
navigator!!.successful(response)
} else {
// Third api call failed, handle error
navigator!!.handleError(Throwable("Api call 3 failed."))
}
}, {throwable ->
// Failure, this is where I want to receive a custom throwable
// in case one of the responses were unsuccessful.
navigator!!.handleError(throwable)
})
我希望可抛出的消息类似于 "apiCall1" 失败,但是当 apiCall1 失败时可抛出的消息只是 NullPointer,因为我传递了 Single.just(null)。
使用此代码
从 flatMap 中抛出 NullPointerException
并通过以下方式捕获错误 .onErrorReturn(throwable -> {//你的工作在这里})
@Carson J.
使用 Single.error()
而不是 Single.just(null)
。
例如:Single.error<TypeHere>(RuntimeException("First api call failed"))
为了最易读的代码,像这样定义一个扩展函数
private fun <T> Single<Response<T>>.decorateWithErrorHandling(): Single<T> {
return this
.onErrorResumeNext { throwable ->
// Map network layer exceptions, e.g. IOException to your specific "domain level" exceptions
Single.error(mapNetworkErrorToSpecificThrowable(throwable))
}
.flatMap { response ->
if (response.isSuccessful) {
Single.just(response.body())
} else {
Single.error(convertToSpecificThrowable(response))
}
}
}
这样使用:
apiCall1()
.composeWithErrorHandling().flatMap { result1 -> apiCall2(result1) }
.composeWithErrorHandling().flatMap { result2 -> apiCall3(result2) }
等等