Kotlin协程CalledFromWrongThreadException

时间:2017-11-02 10:28:16

标签: android kotlin coroutine

我试图使用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
    ...
}

如何让它在后台正确运行?

1 个答案:

答案 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)
}