【问题标题】:Change layout from Coroutine从协程更改布局
【发布时间】:2020-09-06 11:22:36
【问题描述】:
协程启动
GlobalScope.launch(){
get_message_pulling()
}
我需要从get_message_pulling() 编辑布局,但出现错误
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
【问题讨论】:
标签:
android
kotlin
kotlin-coroutines
coroutine
【解决方案1】:
因为在不指定协程上下文的情况下使用GlobalScope.launch() 将在使用Dispatchers.Default 的后台线程上运行您的代码,而不是 MainThread,因此您只能通过 MainThread 协程的上下文与 UI 通信
GlobalScope.launch(){
get_message_pulling()
withContext(Dispatchers.Main) {
// then update the UI
}
}
【解决方案2】:
解决者
private fun get_message_pulling() {
runOnUiThread {
// ui changing code
}
}
【解决方案3】:
您可以使用 Android 特定的Dispatchers.Main 来执行 UI 更新。此外,避免使用GlobalScope 来启动协程,如here 所述。相反,请选择 Dispatchers.Default 或 Dispatchers.IO。
// CPU bound - Dispatchers.Default
// IO bound - Dispatchers.IO
val defaultScope = CoroutineScope(Dispatchers.Default)
defaultScope.launch {
get_message_pulling()
withContext(Dispatchers.Main){
// Your UI updates
}
}