Android Kotlin使用anko doAsync处理ui线程上的异常

时间:2018-03-05 22:11:12

标签: android kotlin anko

我是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不会显示。

2 个答案:

答案 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
     }
}