Вызовы suspend в ViewModel
Получайте данные вне главного потока.
«Вызовы 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 — локальная установка не требуется.
Все уроки этого курса
- Определение интерфейса API Retrofit
- Разбор JSON с Moshi
- Вызовы suspend в ViewModel
- Пользовательский интерфейс загрузки, успеха и ошибки