Что такое ViewModel? Какие ее свойства?android-250

Что такое ViewModel?

ViewModel — это компонент архитектуры Android, предназначенный для хранения и управления UI-данными жизненно-независимым способом. Это часть Android Jetpack и компонент рекомендованной MVVM-архитектуры.

class MyViewModel : ViewModel() {
    private val _data = MutableLiveData<String>()
    val data: LiveData<String> = _data

    fun loadData() {
        _data.value = "Hello ViewModel!"
    }
}

Ключевые свойства ViewModel

1. Сохранение данных при смене конфигурации

Проблема:

  • Активность уничтожается при повороте экрана
  • Теряются UI-данные и текущее состояние

Решение ViewModel:

  • Автоматически сохраняется при смене конфигурации
  • Не требует ручного сохранения в Bundle

2. Отделение логики от UI

// Плохо: логика в Activity
class MyActivity : AppCompatActivity() {
    private var counter = 0 // UI состояние в Activity

    override fun onCreate() {
        button.setOnClickListener { counter++ }
    }
}

// Хорошо: логика в ViewModel
class CounterViewModel : ViewModel() {
    private val _count = MutableLiveData(0)
    val count: LiveData<Int> = _count

    fun increment() { _count.value = _count.value?.plus(1) }
}

3. Жизненный цикл

  • ViewModel живет дольше, чем связанный UI-контроллер (Activity/Fragment)
  • Создается при первом запросе и сохраняется до полного уничтожения Activity/Fragment
// Получение ViewModel в Activity/Fragment
val viewModel: MyViewModel by viewModels()

4. Корректная работа с LiveData

  • Автоматическая отписка от LiveData при уничтожении UI
  • Предотвращение утечек памяти

5. Поддержка корутин

class UserViewModel(
    private val repo: UserRepository
) : ViewModel() {
    private val _users = MutableLiveData<List<User>>()
    val users: LiveData<List<User>> = _users

    fun loadUsers() {
        viewModelScope.launch { // Автоматический отмена при очистке ViewModel
            _users.value = repo.getUsers()
        }
    }
}

viewModelScope:

  • Автоматически отменяет корутины при очистке ViewModel
  • Избавляет от ручного управления жизненным циклом

6. Тестируемость

  • Легко тестируется отдельно от UI
  • Можно подменять зависимости через конструктор
@Test
fun viewModelTest() {
    val testRepo = TestUserRepository()
    val viewModel = UserViewModel(testRepo)

    viewModel.loadUsers()
    assertEquals(3, viewModel.users.value?.size)
}

Когда использовать ViewModel?

  1. Для хранения UI-данных
  2. Для сложной бизнес-логики, связанной с отображением
  3. Для обработки данных перед отображением
  4. Для работы с LiveData/StateFlow

Когда НЕ использовать ViewModel?

  1. Для хранения глобального состояния приложения (используйте Repository)
  2. Для доступа к контексту (риск утечек памяти)
  3. Для прямой работы с View (нарушение принципов MVVM)

Best Practices

  1. Минимальный объем данных: Не превращайте в "мусорную корзину"
  2. Тонкие ViewModels: Выносите сложную логику в UseCase/Interactor
  3. Иммтабельность: Предоставляйте неизменяемые LiveData/StateFlow
  4. Очистка ресурсов: Переопределяйте onCleared() для тяжелых объектов
override fun onCleared() {
    super.onCleared()
    compositeDisposable.clear() // Пример очистки RxJava подписок
}

Резюмируем:

ViewModel — это мощный инструмент для хранения и управления UI-данными, который решает проблемы жизненного цикла, обеспечивает чистую архитектуру и повышает тестируемость кода. Ее ключевые преимущества — сохранение состояния при повороте экрана, интеграция с корутинами и четкое разделение ответственности по шаблону MVVM.