Jetpack Compose Academy · Урок

Вызовы suspend в ViewModel

Получайте данные вне главного потока.

Урок 3 из 413 шагов

«Вызовы suspend в ViewModel» — бесплатный урок Jetpack Compose Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Jetpack Compose Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Jetpack Compose Academy содержит 4 уроков всего.

Никогда не блокируйте главный поток

Сетевые вызовы занимают время, и их выполнение в потоке интерфейса замораживает приложение. Вместо этого перенесите работу из главного потока.

Сделайте конечную точку приостанавливаемой

Пометьте функцию Retrofit ключевым словом приостановки. Теперь она напрямую возвращает разобранный результат и может приостанавливаться, не блокируя поток. ⏸️

@GET("users")
suspend fun getUsers(): List<User>

ViewModel владеет логикой

Получение данных должно находиться в ViewModel, а не в Composable. ViewModel переживает поворот экрана, а код интерфейса отвечает только за отображение.

class UserViewModel : ViewModel() {
    // network logic lives here
}

Запуск с помощью viewModelScope

Приостанавливаемой функции нужна сопрограмма. viewModelScope предоставляет её и автоматически отменяет, когда ViewModel уничтожается.

viewModelScope.launch {
    val users = api.getUsers()
}

Сохранение результата в состоянии

После возврата результата сохраните данные в свойстве state, чтобы Compose мог наблюдать за ними и перерисовывать экран.

var users by mutableStateOf<List<User>>(emptyList())

Оберните вызов в try-catch

Сеть может работать со сбоями, поэтому защитите вызов с помощью try-catch. Необработанное исключение в сопрограмме может привести к сбою всего приложения.

try {
    users = api.getUsers()
} catch (e: Exception) {
    // handle failure
}

Получение данных при инициализации

Запустите первую загрузку в блоке инициализации ViewModel, чтобы данные начали поступать сразу после создания экрана.

init {
    loadUsers()
}

Сохраните логику в функции

Оберните получение данных в именованную функцию, например loadUsers. Так её легко повторно вызвать для повтора запроса или обновления жестом.

fun loadUsers() = viewModelScope.launch {
    users = api.getUsers()
}

Диспетчеры управляют потоками

Retrofit уже выполняет запрос в фоновом диспетчере, поэтому обычно Вам не нужно самостоятельно переключать потоки с помощью Dispatchers.IO.

Сбор состояния в Compose

В Composable прочитайте состояние ViewModel. Поскольку оно наблюдаемое, Compose выполняет рекомпозицию сразу после поступления новых данных.

val users = viewModel.users

Отмена выполняется автоматически

Если пользователь уходит, а ViewModel уничтожается, viewModelScope отменяет выполняющийся вызов, поэтому работа не тратится на закрытый экран.

Быстрая проверка

Какая область видимости автоматически отменяет свои сопрограммы при уничтожении ViewModel?

Повторение: вызов из ViewModel

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

Можно начать бесплатно

Изучай Kotlin с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
30
Уроки
120

Часто задаваемые вопросы

Урок «Вызовы suspend в ViewModel» бесплатный?

Да — полный текст урока «Вызовы suspend в ViewModel» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Jetpack Compose Academy, подпишись на CoddyKit PRO. Курс Jetpack Compose Academy содержит 4 уроков всего.

Чему я научусь в уроке «Вызовы suspend в ViewModel»?

Получайте данные вне главного потока. Ты практикуешь Jetpack Compose Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Jetpack Compose Academy?

Предыдущий опыт не требуется. Jetpack Compose Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Вызовы suspend в ViewModel»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Jetpack Compose Academy?

Да. Каждый урок Jetpack Compose Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Определение интерфейса API Retrofit
  2. Разбор JSON с Moshi
  3. Вызовы suspend в ViewModel
  4. Пользовательский интерфейс загрузки, успеха и ошибки
← Назад к Jetpack Compose Academy