我试图使用Kotlin协同程序在后台进行一些繁重的工作。
但是我收到了此错误消息,
' android.view.ViewRootImpl $ CalledFromWrongThreadException:只有 创建视图层次结构的原始线程可以触及其视图。'
fun setList() {
media_image_list.adapter = imageListAdapter
...
launch {
val images = getImages(galleryPath)
imageListAdapter.setItems(images)
}
}
suspend private fun getImages(): MutableList<Image> {
val uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
...
}
如何让它在后台正确运行?
答案 0 :(得分:2)
我建议通过以下方式解决这个问题:
首先,使用withContext
函数明确地将“繁重的工作”卸载到后台线程中:
// explicitly request it to be executed in bg thread
suspend private fun getImages(): MutableList<Image> = withContext(CommonPool) {
val uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
...
}
然后,始终运行在UI线程中触摸视图或其他UI对象的协同程序:
launch(UI) {
val images = getImages(galleryPath)
imageListAdapter.setItems(images)
}