withContext(Dispatchers.Main)中的代码块未运行

时间:2020-02-24 19:48:36

标签: android kotlin kotlin-coroutines

我是协程的新手。我正在使用以下代码在用户设备中获取音乐列表并显示它。但是withContext块中的代码似乎没有运行。该应用程序运行后即退出。而且 logcat 中没有打印任何问题。

    private suspend fun fetchMusic() {
        CoroutineScope(Dispatchers.IO).launch {
            val mediaList = getAllAudioFromDevice(this@MainActivity)
            setListOnMainThread(mediaList)
        }
    }

    private suspend fun setListOnMainThread(mediaList: List<MusicModel>){
        withContext(Dispatchers.Main) {
            setData(mediaList)
        }
    }

这里可能是什么问题?谢谢。

1 个答案:

答案 0 :(得分:1)

launch创建一个新的协程并将其启动,而无需等待它完成。

通常,协程的一种干净实现是使每个暂挂函数句柄切换到适当的调度程序。如果您只打算在后台执行此操作,则该函数应以= withContext开头。例如,在您的情况下,如果getAllAudioFromDevice是您始终希望在后台执行的操作,则它应类似于:

private suspend fun getAllAudioFromDevice() = withContext(Dispatchers.IO) {
    // fetch it
    // return it
}

然后您的fetchMusic会简单得多:

private suspend fun fetchMusic() {
    val mediaList = getAllAudioFromDevice(this@MainActivity)
    setListOnMainThread(mediaList)
}

getAllAudioFromDevice ()是您希望能够在前台或后台调用的函数,而不必从协程调用。然后,您将其保持不变(而不是暂停功能),并根据需要将调用包装在withContext()中,

private suspend fun fetchMusic() {
    val mediaList = withContext(Dispatchers.IO) {
        getAllAudioFromDevice(this@MainActivity)
    }
    setListOnMainThread(mediaList)
}

您还提到该应用程序在运行后立即退出。为什么退出?我们可以查看堆栈跟踪中未捕获的异常吗?