Ответ
В Kotlin есть несколько видов Scope:
- Global Scope - живет пока работает приложение (не рекомендуется использовать из-за утечек памяти)
GlobalScope.launch { /* ... */ }
- CoroutineScope - привязан к жизненному циклу компонента
class MyActivity : AppCompatActivity(), CoroutineScope {
override val coroutineContext = Dispatchers.Main + Job()
}
- ViewModelScope - автоматически отменяется при очистке ViewModel
viewModelScope.launch { /* ... */ }
- LifecycleScope - привязан к LifecycleOwner (Activity/Fragment)
lifecycleScope.launch { /* ... */ }
-
viewLifecycleOwner.lifecycleScope - для Fragment (привязан к жизненному циклу View)
-
rememberCoroutineScope() - в Compose, живет пока активен Composition
Лучшие практики:
- Избегать GlobalScope
- Использовать scope, соответствующие жизненному циклу компонентов
- Для ViewModel предпочтительнее viewModelScope