我正在尝试在协程中使用Sequence(例如从File.walk返回的FileTreeWalk),但是我的实现一直在阻塞ui线程。
有没有一种好的方法来处理序列和映射协程中的项目?
这是我的代码片段:
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
(UI线程)。您继续为后台作业使用同一调度程序,而不是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/