我是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)
}
}这里有什么问题吗?谢谢。
发布于 2020-02-24 21:54:15
launch创建了一个新的协同线,并在不等待它完成的情况下启动它。
通常,coroutines的一个干净的实现就是让每个挂起的函数句柄切换到适当的dispatcher。如果这是您只打算在后台执行的操作,则函数应该以= 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)
}您还提到了应用程序一开始就会退出。它为什么要退出?是否有一个我们可以查看的堆栈跟踪的未明异常?
https://stackoverflow.com/questions/60382928
复制相似问题