Android Kotlin 使用 anko doAsync 在 ui 线程上处理异常
Android Kotlin handling exceptions on ui thread with anko doAsync
我是 Kotlin 的新手,我有一个带有自定义异常处理程序的 doAsync:
doAsync(exceptionHander = {e -> handleException(e)}){
//rest call
}
private val handleException= {throwable : Throwable ->
if(throwable is HttpClientErrorException){
val response = JSONObject(throwable.responseBodyAsString)
Toast.makeText(this, response["message"].toString(), Toast.LENGTH_LONG).show()
}
}
但是 Toast 从未显示。如何在 Toast 上显示此异常消息?是否在 ui 线程上调用了异常处理程序?
更新:
我这样测试过:
doAsync(exceptionHander = {e -> handleException(e)}){
throw HttpClientErrorException(HttpStatus.INTERNAL_SERVER_ERROR, "An error has occurred")
}
使用相同的错误处理程序,但不会显示 toast。
由于在后台线程中调用了异常处理程序,因此我在 doAsync
块中使用了 try-catch
。
doAsync{
var exception: Exception? = null
try {
//rest call
}
catch(e: HttpClientErrorException){
exception = e
}
uiThread {
if (exception != null){
// Show the exception message.
}
else {
// Update the UI with the result
}
}
}
因此,通过这种方式可以处理 UI 线程上的预期异常。欢迎反馈。
我还认为不应忽略意外异常(或仅记录)。但是每次使用doAsync
都要加上try-canth block,不是很方便。我创建了以下效用函数:
fun <T> T.doAsyncThrowOnUI(task: AnkoAsyncContext<T>.() -> Unit) = doAsync(
exceptionHandler = { thr -> Handler(Looper.getMainLooper()).post { throw thr }},
task = task)
它只是调用 Anko 的 doSync
并传递异常处理程序,该处理程序会在 UI 线程上重新抛出所有未处理的异常。使用 doAsyncThrowOnUI
代替 Anko 的 doAsync
。
doAsyncThrowOnUI {
// do something on bg thread (exceptions rethrown on ui thread)
uiThread {
// do something on ui thread
}
}
我是 Kotlin 的新手,我有一个带有自定义异常处理程序的 doAsync:
doAsync(exceptionHander = {e -> handleException(e)}){
//rest call
}
private val handleException= {throwable : Throwable ->
if(throwable is HttpClientErrorException){
val response = JSONObject(throwable.responseBodyAsString)
Toast.makeText(this, response["message"].toString(), Toast.LENGTH_LONG).show()
}
}
但是 Toast 从未显示。如何在 Toast 上显示此异常消息?是否在 ui 线程上调用了异常处理程序?
更新:
我这样测试过:
doAsync(exceptionHander = {e -> handleException(e)}){
throw HttpClientErrorException(HttpStatus.INTERNAL_SERVER_ERROR, "An error has occurred")
}
使用相同的错误处理程序,但不会显示 toast。
由于在后台线程中调用了异常处理程序,因此我在 doAsync
块中使用了 try-catch
。
doAsync{
var exception: Exception? = null
try {
//rest call
}
catch(e: HttpClientErrorException){
exception = e
}
uiThread {
if (exception != null){
// Show the exception message.
}
else {
// Update the UI with the result
}
}
}
因此,通过这种方式可以处理 UI 线程上的预期异常。欢迎反馈。
我还认为不应忽略意外异常(或仅记录)。但是每次使用doAsync
都要加上try-canth block,不是很方便。我创建了以下效用函数:
fun <T> T.doAsyncThrowOnUI(task: AnkoAsyncContext<T>.() -> Unit) = doAsync(
exceptionHandler = { thr -> Handler(Looper.getMainLooper()).post { throw thr }},
task = task)
它只是调用 Anko 的 doSync
并传递异常处理程序,该处理程序会在 UI 线程上重新抛出所有未处理的异常。使用 doAsyncThrowOnUI
代替 Anko 的 doAsync
。
doAsyncThrowOnUI {
// do something on bg thread (exceptions rethrown on ui thread)
uiThread {
// do something on ui thread
}
}