0Pricing
Android Academy · Урок

ViewModel и LiveData

Переживайте изменения конфигурации с помощью ViewModel. Предоставляйте реактивные потоки данных через LiveData и наблюдайте за ними в активностях и фрагментах.

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

Проблема с Activity

Хранение данных непосредственно в Activity создаёт две основные проблемы:

  • При повороте телефона Activity уничтожается и создаётся заново — все данные теряются
  • Если получать данные из сети в onCreate, запрос выполняется заново после каждого поворота — это неэффективно

ViewModel решает обе проблемы.

Что такое ViewModel

ViewModel — это компонент архитектуры Android, который:

  • Переживает изменения конфигурации (поворот экрана, смену темы)
  • Хранит данные, связанные с интерфейсом, и бизнес-логику
  • Уничтожается только после того, как пользователь окончательно покидает экран

Практическое правило: если данные должны переживать поворот экрана, поместите их в ViewModel.

Создание ViewModel

Унаследуйте класс от ViewModel и добавьте его в зависимости Gradle:

// app/build.gradle:
// implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0'
// implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.7.0'

import androidx.lifecycle.ViewModel

class CounterViewModel : ViewModel() {

    var count = 0
        private set

    fun increment() {
        count++
    }

    fun reset() {
        count = 0
    }
}

Получение ViewModel в Activity

Используйте ViewModelProvider или делегат by viewModels(), чтобы получить экземпляр ViewModel:

import androidx.activity.viewModels

class CounterActivity : AppCompatActivity() {

    private lateinit var binding: ActivityCounterBinding
    // Android manages the ViewModel lifecycle — never instantiate it yourself
    private val viewModel: CounterViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityCounterBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // This shows the count is preserved after rotation!
        binding.tvCount.text = viewModel.count.toString()

        binding.btnPlus.setOnClickListener {
            viewModel.increment()
            binding.tvCount.text = viewModel.count.toString()
        }
    }
}

Что такое LiveData

LiveData — это наблюдаемый контейнер данных. Интерфейс наблюдает за значениями LiveData и автоматически обновляется при изменении значения.

  • Учитывает жизненный цикл — обновляет только активных наблюдателей, поэтому Activity не завершается с ошибкой в фоновом режиме
  • Всегда содержит актуальные данные — новые наблюдатели сразу получают последнее значение

LiveData в ViewModel

Используйте MutableLiveData в закрытом виде (ViewModel может записывать данные), а наружу предоставляйте его как LiveData (интерфейс может только наблюдать):

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class CounterViewModel : ViewModel() {

    private val _count = MutableLiveData(0)
    val count: LiveData<Int> = _count  // read-only for the UI

    fun increment() {
        _count.value = (_count.value ?: 0) + 1
    }

    fun reset() {
        _count.value = 0
    }
}

Наблюдение за LiveData в Activity

Вызывайте .observe(lifecycleOwner) { value -> }, чтобы реагировать на изменения:

class CounterActivity : AppCompatActivity() {

    private val viewModel: CounterViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...

        // Automatically updates TextView whenever count changes
        viewModel.count.observe(this) { count ->
            binding.tvCount.text = count.toString()
        }

        binding.btnPlus.setOnClickListener { viewModel.increment() }
        binding.btnReset.setOnClickListener { viewModel.reset() }
    }
}

LiveData и State Flow

LiveData — классический подход. В современном коде Kotlin вместо него часто используют StateFlow из Kotlin Coroutines:

  • StateFlow — основан на корутинах и не зависит от Android
  • Собирается с помощью repeatOnLifecycle в Activity
  • Лучше подходит для сложного управления состоянием

Оба подхода хорошо работают: с LiveData проще начать, а StateFlow вы встретите в более крупных приложениях.

ViewModel с несколькими наблюдателями

Несколько компонентов интерфейса могут наблюдать за одним и тем же LiveData. Например, TextView и состояние доступности Button могут реагировать на одно и то же значение данных в ViewModel — без дополнительного кода в ViewModel.

Так обеспечивается чёткое разделение ответственности: ViewModel хранит состояние, а интерфейс только наблюдает и отображает его.

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

Когда ViewModel уничтожается?

Итоги: ViewModel и LiveData

Теперь вы умеете создавать интерфейсы, учитывающие жизненный цикл:

  • ViewModel переживает изменения конфигурации (поворот экрана)
  • Используйте by viewModels(), чтобы получить ViewModel в Activity
  • Используйте шаблон MutableLiveData (закрытый доступ) / LiveData (открытый доступ)
  • Наблюдайте с помощью .observe(this) { value -> updateUI(value) }
  • Интерфейс обновляется автоматически — вручную обновлять его не требуется

Далее: постоянное сохранение данных с помощью базы данных Room.

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

Урок «ViewModel и LiveData» бесплатный?

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

Чему я научусь в уроке «ViewModel и LiveData»?

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

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

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

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

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

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

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

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

  1. ViewModel и LiveData
  2. База данных Room
  3. Корутины и приостанавливаемые функции
  4. Шаблон репозитория
  5. Компонент навигации
  6. Внедрение зависимостей с Hilt
← Назад к Android Academy