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