Обработка файловых операций с сопрограммами - PullRequest
0 голосов
/ 19 ноября 2018

В настоящее время я разрабатываю постоянную библиотеку для Android в Котлине.В моем коде я должен обрабатывать файловые операции (чтение, запись и т. Д.), Которые я хотел бы выполнять асинхронно для повышения производительности.Я думал, что смогу сделать это с новой функцией сопрограммы Kotlin 1.3

GlobalScope.launch {
    writeFileAsync(file, bytes)
}

private suspend fun writeFileAsync(file: File, bytes: ByteArray) {
    try {
        file.writeBytes(bytes)
    }  catch (e: Exception) {
        throw PersistenceException(e)
    }
}

Допустим, я нахожусь в ситуации, когда пользователь изменил объект, который теперь сохраняется с кодом выше, и он закрываетприложение до сопрограмма закончена.Конечно, я не хочу останавливать сопрограмму из-за потери данных, но это нормально, или я пропускаю сопрограмму?

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

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Используйте WorkManager , чтобы выполнять свою работу в фоновом режиме, когда приложение может быть остановлено.

0 голосов
/ 20 ноября 2018

Код, который вы написали, вообще не использует приостановку сопрограммы.Он просто передает блок кода в общий пул потоков по умолчанию, для которого вам не нужны сопрограммы.Вы также можете написать

ForkJoinPool.commonPool().submit {
    file.writeBytes(bytes)
}

и вам не нужна зависимость от сопрограмм.

Однако, если вы хотите дождаться завершения операции ввода-вывода и следовать за ней с помощью некоторых операций графического интерфейсатогда сопрограммы вам помогут.Вы можете написать

this.launch {
    withContext(Dispatchers.IO) {
        file.writeBytes(bytes)
    }
    updateGui()
}

Однако это не помешает пользователю закрыть приложение во время выполнения операций.Это еще один уровень сложности, и для его достижения вы должны более глубоко отделить операции от своей Деятельности, WorkManager представляется самым современным выбором.

0 голосов
/ 19 ноября 2018

Во-первых, код, который вы выполняете в сопрограмме, не является более производительным. Это, вероятно, даже немного менее производительно. Но это более одновременно.

Во-вторых, если пользователь завершает работу приложения, все его потоки будут закрыты. Поскольку сопрограммы основаны на пуле потоков, они также будут остановлены. Если вы хотите, чтобы что-то продолжало работать в фоновом режиме, используйте вместо этого что-то вроде Сервиса.

В-третьих, если вы хотите получить блокировку файла, используйте FileLock

...