Android Kotlin使用anko doAsync处理ui线程上的异常
我是Kotlin的新手,我有一个自定义异常处理程序的doAsync: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
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
}
}