GlobalScope для сохранения файлов в Android - PullRequest
0 голосов
/ 24 октября 2019

У меня есть сценарии, в которых мне нужно сохранить некоторые объекты на диск. До сих пор я делал это с помощью ExecutorService Java. Но сейчас я делаю рефакторинг частей своего кода в Kotlin, и мне было интересно, обрабатываю ли я это право.

Так что в Java у меня есть код, который идет к моим функциям Kotlin:

// Java code calls this function in KotlinUtils.kt:
fun saveFileInBackground(saveObj: Any, fileName: String) {
    GlobalScope.launch {
        saveFile(...)
    }
}

private suspend fun saveFile(data: ByteArray, ...) {
    withContext(Dispatchers.IO) {
        var file = File(....)
        if (!file.exists()) file.mkdirs()

        file.writeBytes(data)
    }
}

Теперь я прочитал этот пост: https://medium.com/@elizarov/the-reason-to-avoid-globalscope-835337445abc

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

Другой вариант, который я имел в виду, - это чтобы класс KotlinUtils реализовывал CoroutineScope, а затем просто вызывал launch вместо GlobalScope.launch . С другой стороны, это немного проблематично, потому что кажется, что KotlinUtil должен быть абстрактным, чего не может быть (это класс @Singleton, использующий dagger2)

Однако я довольно новичок в Kotlin иСопрограммы, так что, возможно, я что-то не так понял. Любой совет будет высоко ценится.

1 Ответ

0 голосов
/ 27 октября 2019

GlobalScope является синглтоном и не связан ни с одним заданием. Это запускает сопрограммы верхнего уровня и крайне не рекомендуется использовать, потому что, если вы запускаете сопрограммы в глобальном масштабе, вы теряете все преимущества, которые вы получаете от структурированного параллелизма

Так что если вы знаете это и вашиЗадача полностью не зависит от всего остального в вашем приложении. Таким образом, независимым, я имею в виду, вы не хотите отменять запущенные в данный момент задачи, даже если что-то идет не так в других частях вашего приложения. В этом случае, на мой взгляд, хорошо использовать GlobalScope

Например, если вы вызываете задачу saveFileInBackground в цикле и даже если она не выполняется в одной из итераций, вы не хотитезавершить цикл и захотеть продолжить с остальными вашими итерациями.

Еще одна вещь, о которой следует помнить при использовании GlobalScope, если вы по ошибке напишите неверный код в GlobalScope, он останется там и будетне отменяется другими частями приложения, что означает, что ваше приложение никогда не прекратит работу

...