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 — локальная установка не требуется.
Все уроки этого курса
- ViewModel и LiveData
- База данных Room
- Корутины и приостанавливаемые функции
- Шаблон репозитория
- Компонент навигации
- Внедрение зависимостей с Hilt