gpt4 book ai didi

android - 在协程中处理序列

转载 作者:行者123 更新时间:2023-11-29 16:34:12 24 4
gpt4 key购买 nike

我正在尝试在协同程序中使用序列(例如 FileTreeWalk 从 File.walk 返回),但我的实现一直阻塞 ui 线程。

有没有一种好的方法来处理序列并在协程中映射项目?

这是我的代码 fragment :

override fun onResume() {
super.onResume()
launch {
apkFiles = searchMyFiles(rootDir).await()
showMyFiles()
}
}

private fun searchMyFiles(dir: File): Deferred<MutableList<MyFile>> {
return async {
dir.walk().filter { !it.isDirectory }
.filter { it.extension.equals(MY_EXTENSION, true) }
.map { MyFile(it, context) }.filter { it.valid
}.sorted().toMutableList()
}
}

最佳答案

尽管您的代码中没有任何证据,但我会猜测您在隐式使用的 CoroutineScope 中设置的默认调度程序是 Dispatchers.Main(界面线程)。您继续为后台作业使用相同的调度程序,而不是 Dispatchers.IO

第二点是你使用 async-await 没有任何目的,你应该使用 withContext 并将你的函数声明为 suspend fun .

鉴于上述情况,您的代码应该是

override fun onResume() {
super.onResume()
launch {
apkFiles = searchMyFiles(rootDir)
showMyFiles()
}
}

private suspend fun searchMyFiles(dir: File) : MutableList<MyFile> =
withContext(Dispatchers.IO) {
dir.walk()
.filter { !it.isDirectory }
.filter { it.extension.equals(MY_EXTENSION, true) }
.map { MyFile(it, context) }
.filter { it.valid }
.sorted()
.toMutableList()
}
}

关于android - 在协程中处理序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53036614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com