Android Kotlin Coroutines: Является ли использование Global scope анти-паттерном? - PullRequest
0 голосов
/ 24 мая 2019

Это скорее вопрос для совета, чем для того, чтобы.

Я использую viewmodelScope для запуска заданий для взаимодействия с моей базой данных в моей ViewModel.Некоторые из этих заданий могут занять много времени, и их использование может отойти от действия / фрагмента во время выполнения задания.

Я хочу, чтобы задание выполнялось несмотря ни на что.Допустимо ли использовать GlobalScope в этом контексте?

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

На первый взгляд GlobalScope выглядит как хороший вариант для выполнения длительных операций.Но тогда вы столкнетесь с проблемой жизненного цикла Android .

Предположим, вы больше не связаны с ним.В тот момент, когда ваша глобальная операция завершена, вы отмените обратные вызовы внутри вашего Activity или Fragment.Кроме того, вы также утечете эти экземпляры.

Вместо этого вам следует рассмотреть возможность вызова вашего метода в NonCancellable Job :

withContext(NonCancellable) {
    ...
} 

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

Если ваши вызовы совершенно не связаны с чем-либо из жизненного цикла Android , поэтому не ограничены, просто перейдите на GlobalScope.

0 голосов
/ 25 мая 2019

По словам Романа Елизарова, руководителя команды библиотек Котлина, работающего над сопрограммами, по этой теме :

Вряд ли есть причина использовать GlobalScope в приложении, которое основан на соплинах Kotlin.

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

Похоже, что это деятельность в вашем случае. Однако, если ваш пользовательский интерфейс не может помешать пользователю покинуть активность до завершения работы, и очень важно, чтобы работа всегда выполнялась, тогда вам, вероятно, нужно больше, чем просто сопрограммы. Рассмотрите возможность планирования вашей длительной работы с помощью WorkManager .

В любом случае, старайтесь избегать GlobalScope, так как это не правильное решение.

...