在协程中处理序列

Handling Sequences in Coroutines

我正在尝试在协同程序中使用序列(例如 FileTreeWalk 从 File.walk 返回),但我的实现一直阻塞 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()
    }
}