G00*_*0fY 1 android kotlin kotlin-coroutines
我试图在协程中使用序列(例如从 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()
}
}
Run Code Online (Sandbox Code Playgroud)
尽管您的代码中没有证据,但我会猜测您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()
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
577 次 |
| 最近记录: |