← Назад к вопросам

Что такое ViewModelScope?

1.8 Middle🔥 121 комментариев
#Жизненный цикл и навигация#Многопоточность и асинхронность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

ViewModelScope — основа управления асинхронными операциями в MVVM

Что это такое

ViewModelScope — это корутин-скоп, автоматически привязанный к жизненному циклу ViewModel. Это компонент из lifecycle-viewmodel-ktx библиотеки, который позволяет безопасно запускать корутины без утечек памяти.

class UserViewModel : ViewModel() {
    fun loadUser() {
        viewModelScope.launch {
            val user = repository.getUser()
            _userState.value = user
        }
    }
}

Жизненный цикл

Ключевое преимущество: корутины автоматически отменяются когда ViewModel удаляется из памяти. Это предотвращает:

  • Утечки памяти: нет необходимости вручную отменять корутины
  • Крахи приложения: обновление UI на удалённом объекте
  • Неконтролируемые фоновые задачи: всё завершается вместе с ViewModel

Почему это лучше, чем GlobalScope

GlobalScope.launch существует всё время жизни приложения и не отменяется автоматически. Это приводит к утечкам памяти и непредсказуемому поведению. ViewModelScope привязан к ViewModel, поэтому:

  • Корутина отменяется вместе сViewModel
  • Нет утечек памяти
  • Безопасная работа с UI

Структурированная конкурентность

ViewModelScope реализует structured concurrency — все корутины в скопе имеют общего родителя (ViewModel). Это означает:

  • Отмена родителя отменяет всех детей
  • Исключение в дочерней корутине может распространиться на родителя
  • Всегда контролируемое состояние

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

class ProductViewModel : ViewModel() {
    private val _products = MutableStateFlow<List<Product>>(emptyList())
    val products = _products.asStateFlow()

    init {
        // Загрузка при создании ViewModel
        viewModelScope.launch {
            _products.value = repository.fetchProducts()
        }
    }

    fun refreshProducts() {
        viewModelScope.launch {
            try {
                _products.value = repository.fetchProducts()
            } catch (e: Exception) {
                // Обработка ошибки
            }
        }
    }
}

Альтернативы

  • lifecycleScope — для Fragment/Activity, привязан к жизненному циклу UI
  • coroutineScope — для функций, требует явной отмены
  • supervisorScope — позволяет дочерним корутинам падать независимо

Выводы

ViewModelScope — это стандартный, безопасный и правильный способ запускать асинхронные операции в Android. Его использование гарантирует отсутствие утечек памяти и правильное управление жизненным циклом корутин. Это базовый инструмент современной Android разработки, часть рекомендаций от Google.