我是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不会显示。
答案 0 :(得分:3)
由于在后台线程中调用了异常处理程序,因此我在Items.B
块中使用了try-catch
。
doAsync
所以这样就可以在UI线程上处理预期的异常。欢迎提供反馈。
答案 1 :(得分:3)
我还认为,不应忽略(或仅记录)意外的异常。但是,每次使用doAsync
时,添加try-canth块并不是很方便。我创建了以下效用函数:
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
}
}