Назад к вопросам
Middle
120
questionbank

Что такое CoroutineScope в Kotlin и как он используется в разработке под Android?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

CoroutinesScope определяет контекст и жизненный цикл корутины. Он управляет группой дочерних корутин и отменяет их при отмене самого скоупа.

В Android CoroutineScope используется для привязки жизненного цикла корутин к жизненному циклу компонента (Activity, Fragment, ViewModel).

Существует несколько типов скоупов:

  • GlobalScope: Живет на протяжении всего приложения. Его использование не рекомендуется из-за сложности отмены и потенциальных утечек памяти.
  • ViewModelScope: Предоставляется KTX библиотекой для ViewModel. Отменяется автоматически, когда ViewModel очищается (onCleared()).
  • LifecycleScope: Предоставляется KTX библиотекой для Activity/Fragment. Привязан к жизненному циклу компонента и отменяется при его уничтожении. Можно запускать корутины в разных состояниях жизненного цикла (lifecycle.coroutineScope.launchWhenCreated, lifecycle.coroutineScope.launchWhenStarted, lifecycle.coroutineScope.launchWhenResumed).
  • Пользовательские скоупы: Можно создать свой CoroutineScope при необходимости.

Пример использования ViewModelScope:

// ViewModel.kt
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch

class MyViewModel : ViewModel() {

    fun performAsyncTask() {
        viewModelScope.launch {
            // Асинхронная задача
        }
    }

    override fun onCleared() {
        super.onCleared()
        // viewModelScope автоматически отменяется здесь
    }
}

Пример использования LifecycleScope:

// MyActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch

class MyActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_my)

        lifecycleScope.launch {
            // Корутина будет запущена и отменена вместе с Activity
        }
    }
}

Таблица сравнения скоупов:

Scope Жизненный цикл Рекомендуется для Примечание
GlobalScope Приложение - Не рекомендуется, утечки памяти
ViewModelScope ViewModel.onCleared() ViewModel Автоматически отменяется
LifecycleScope Activity/Fragment onDestory() Activity/Fragment Привязан к жизненному циклу
Custom Scope Определяется пользователем - Гибкость