首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >withContext(Dispatchers.Main)中的代码块未运行

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

Stack Overflow用户
提问于 2020-02-24 19:48:36
回答 1查看 666关注 0票数 1

我是coroutines的新手。我使用下面的代码获取用户设备中的音乐列表并显示它。但是withContext块中的代码似乎没有运行。该应用程序一运行就会退出。logcat中没有打印问题。

代码语言:javascript
复制
    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)
        }
    }

这里有什么问题吗?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-02-24 21:54:15

launch创建了一个新的协同线,并在不等待它完成的情况下启动它。

通常,coroutines的一个干净的实现就是让每个挂起的函数句柄切换到适当的dispatcher。如果这是您只打算在后台执行的操作,则函数应该以= withContext开头。例如,在您的示例中,如果您总是希望在后台执行getAllAudioFromDevice,则应该如下所示:

代码语言:javascript
复制
private suspend fun getAllAudioFromDevice() = withContext(Dispatchers.IO) {
    // fetch it
    // return it
}

然后您的fetchMusic就会简单得多:

代码语言:javascript
复制
private suspend fun fetchMusic() {
    val mediaList = getAllAudioFromDevice(this@MainActivity)
    setListOnMainThread(mediaList)
}

或者,getAllAudioFromDevice ()是一个您希望能够在前台或后台调用的函数,而不一定是从协同线调用的。然后,您将保持原样(而不是挂起函数),并按需要在withContext()中包装调用,如下所示:

代码语言:javascript
复制
private suspend fun fetchMusic() {
    val mediaList = withContext(Dispatchers.IO) {
        getAllAudioFromDevice(this@MainActivity)
    }
    setListOnMainThread(mediaList)
}

您还提到了应用程序一开始就会退出。它为什么要退出?是否有一个我们可以查看的堆栈跟踪的未明异常?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60382928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档