Обработка последовательностей в сопрограммах - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь использовать последовательность (например, FileTreeWalk , возвращенную из File.walk) внутри сопрограммы, но моя реализация продолжает блокировать поток пользовательского интерфейса.

Есть ли хороший способ обработки последовательностей и сопоставления элементов внутри сопрограмм?

Вот фрагмент моего кода:

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()
  }
}

1 Ответ

0 голосов
/ 29 октября 2018

Хотя в вашем коде нет доказательств, я предполагаю, что ваш диспетчер по умолчанию, установленный в 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()
    }
}
...