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

Android Kotlin使用anko doAsync处理ui线程上的异常,android,kotlin,anko,Android,Kotlin,Anko,我是Kotlin的新手,我有一个自定义异常处理程序的doAsync: doAsync(exceptionHander = {e -> handleException(e)}){ //rest call } private val handleException= {throwable : Throwable -> if(throwable is HttpClientErrorException){ val response = J

我是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()
        }
    }
然而,祝酒词从未出现过。如何在祝酒词上显示此异常消息?是否在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块不是很方便。我创建了以下实用程序功能:

fun <T> T.doAsyncThrowOnUI(task: AnkoAsyncContext<T>.() -> Unit) = doAsync(
        exceptionHandler = { thr -> Handler(Looper.getMainLooper()).post { throw thr }},
        task = task)

也许这是一个愚蠢的问题,但是你确定你的异常是一个
HttpClientErrorException
?是的,即使没有,如果toast不会显示。你在LogCat中得到任何异常吗?exceptionHandler在哪里运行,在主线程中还是在后台线程中?是的,我在LogCat中得到了一个异常。我不确定异常处理程序是在主线程还是BackGrund线程中运行。这是问题的一部分,我没有带muy笔记本电脑,我会尽快更新问题。
doAsyncThrowOnUI {
     // do something on bg thread (exceptions rethrown on ui thread)

     uiThread {
        // do something on ui thread
     }
}