0Pricing
Android Academy · Урок

viewModelScope и диспетчеры

Выполняйте работу в правильном потоке

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

Области с учётом жизненного цикла

Android предоставляет встроенные области, которые отменяются автоматически:

  • viewModelScope — отменяется при очистке ViewModel.
  • lifecycleScope — связан с жизненным циклом Activity/Fragment.

Использование viewModelScope

Запускайте работу с данными в viewModelScope. При очистке ViewModel сопрограмма будет отменена автоматически — ручная очистка не требуется.

class UserViewModel(
    private val repo: UserRepository
) : ViewModel() {
    fun load() {
        viewModelScope.launch {
            val users = repo.getUsers()
            _uiState.value = UiState(users)
        }
    }
}

Почему не следует использовать GlobalScope

Избегайте GlobalScope: его сопрограммы живут всё время работы приложения и не связаны с жизненным циклом, что приводит к утечкам и продолжению работы после закрытия экрана.

Что такое диспетчеры

Диспетчер определяет, в каком потоке (или пуле потоков) выполняется сопрограмма. Правильный выбор освобождает главный поток.

Стандартные диспетчеры

  • Dispatchers.Main — поток пользовательского интерфейса.
  • Dispatchers.IO — для сетевого ввода-вывода и работы с диском.
  • Dispatchers.Default — для работы, интенсивно использующей CPU.

По умолчанию viewModelScope использует Main

viewModelScope запускает сопрограммы в Dispatchers.Main. Это подходит для обновления состояния, но тяжёлую работу следует перенести с него.

Переключение с помощью withContext

Используйте withContext, чтобы выполнить блок в другом диспетчере, а затем вернуться к вызывающему коду.

suspend fun loadFile(): String =
    withContext(Dispatchers.IO) {
        File("data.txt").readText()
    }

Функции, безопасные для главного потока

Функция является безопасной для главного потока, если её можно безопасно вызывать из главного потока, поскольку внутри она сама выполняет переключение. Репозитории должны быть безопасными для главного потока, чтобы вызывающему коду не приходилось беспокоиться о потоках.

class Repo {
    suspend fun getUsers() =
        withContext(Dispatchers.IO) { dao.getAll() }
}

Room и Retrofit безопасны для главного потока

Хорошая новость: suspend-методы DAO в Room и suspend-вызовы Retrofit уже выполняются не в главном потоке. Обычно для них не требуется явно использовать withContext.

Работа с CPU в Default

Для ресурсоёмких вычислений, например сортировки огромного списка или разбора данных, используйте Dispatchers.Default, чтобы интерфейс не зависал.

val sorted = withContext(Dispatchers.Default) {
    bigList.sortedBy { it.score }
}

Внедрение диспетчеров

Для возможности тестирования внедряйте диспетчеры вместо жёсткого указания. Это позволяет подменять их тестовым диспетчером.

class Repo(
    private val io: CoroutineDispatcher = Dispatchers.IO
) {
    suspend fun load() = withContext(io) { /* ... */ }
}

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

Проверьте своё понимание областей и диспетчеров.

Повторение

Вы научились:

  • viewModelScope отменяет сопрограммы при очистке ViewModel.
  • Избегать GlobalScope.
  • Выбирать диспетчеры: Main (интерфейс), IO (сеть/диск), Default (CPU).
  • withContext переключает потоки; стремитесь создавать функции, безопасные для главного потока.

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

Урок «viewModelScope и диспетчеры» бесплатный?

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

Чему я научусь в уроке «viewModelScope и диспетчеры»?

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

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

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

Сколько времени занимает урок «viewModelScope и диспетчеры»?

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

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

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

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

  1. Основы корутин и области видимости
  2. viewModelScope и диспетчеры
  3. Основы Kotlin Flow
  4. StateFlow и SharedFlow
← Назад к Android Academy