我是协程的新手。我正在使用以下代码在用户设备中获取音乐列表并显示它。但是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)
}
}
这里可能是什么问题?谢谢。
答案 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)
}
您还提到该应用程序在运行后立即退出。为什么退出?我们可以查看堆栈跟踪中未捕获的异常吗?