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:
// Плохо: логика в 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) }
}
// Получение ViewModel в Activity/Fragment
val viewModel: MyViewModel by viewModels()
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:
@Test
fun viewModelTest() {
val testRepo = TestUserRepository()
val viewModel = UserViewModel(testRepo)
viewModel.loadUsers()
assertEquals(3, viewModel.users.value?.size)
}
override fun onCleared() {
super.onCleared()
compositeDisposable.clear() // Пример очистки RxJava подписок
}
ViewModel — это мощный инструмент для хранения и управления UI-данными, который решает проблемы жизненного цикла, обеспечивает чистую архитектуру и повышает тестируемость кода. Ее ключевые преимущества — сохранение состояния при повороте экрана, интеграция с корутинами и четкое разделение ответственности по шаблону MVVM.