GlobalScope.launch
используется, если вы хотите запустить сопрограмму, которая должна оставаться в памяти в течение всего жизненного цикла приложения.
Это не обязательно так, его можно использовать для любой сопрограммы, которая не связана с действием или фазой приложения, от которой пользователь мог бы уйти. Например, вы можете запустить задачу, которая отправляет одностороннее сообщение на ваш сервер. Вероятно, он скоро закончится sh, и вы хотите, чтобы он закончил sh независимо от того, что пользователь сделает позже.
Я предполагаю, что если бы я использовал GlobalScope.launch
, он мог бы сохранить фрагмент из мусора?
Только если сопрограмма сохраняет ссылку на фрагмент или его часть, и только если она может работать в течение длительного времени.
В частности, типичная вещь, которую вы делаете в событии по щелчку, - это выполнение некоторых действий, связанных с вашим бэкэндом (т. Е. Сетевым подключением), а затем обновление пользовательского интерфейса. Ясно, что это может занять много времени (особенно в случае плохой сети), и в нем сохраняется ссылка на элемент пользовательского интерфейса, который будет затронут позже. Это должно быть связано с жизненным циклом фрагмента.
Как правильно запустить сопрограмму из события щелчка, определенного во фрагменте?
Проще всего это сделать, следуя официальной документации :
class MyFragment : Fragment, CoroutineScope by MainScope {
override fun onDestroy() {
cancel() // extension on CoroutineScope
}
... rest of your fragment code ...
}
. Здесь описывается идиома, которую вам раньше приходилось писать вручную (как видно из другого ответа здесь).