Назад к вопросам
Junior
106
questionbank
Расскажи о Jetpack ViewModel.
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
ViewModel хранит и управляет UI-связанными данными c учетом жизненного цикла. Он переживает изменения конфигурации (повороты экрана, изменения раскладки), предотвращая потерю данных.
Ключевые особенности:
- Сохранение данных: ViewModel не уничтожается при изменениях конфигурации, сохраняя состояние UI.
- Отделение логики от UI: Бизнес-логика помещается в ViewModel, что упрощает тестирование и поддержку Activity/Fragment.
- Интеграция с LiveData: Часто используется с LiveData для наблюдения за изменениями данных.
Пример использования:
// MyViewModel.kt
import androidx.lifecycle.ViewModel
class MyViewModel : ViewModel() {
// Данные, которые нужно сохранить при изменении конфигурации
var counter = 0
}
// MyActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.lifecycle.ViewModelProvider
class MyActivity : AppCompatActivity() {
private lateinit var viewModel: MyViewModel
private lateinit var counterText: TextView
private lateinit var incrementButton: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Получение ViewModel
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
counterText = findViewById(R.id.counter_text)
incrementButton = findViewById(R.id.increment_button)
// Отображение данных из ViewModel
updateCounterDisplay()
incrementButton.setOnClickListener {
viewModel.counter++
updateCounterDisplay()
}
}
private fun updateCounterDisplay() {
counterText.text = viewModel.counter.toString()
}
}
Срок жизни: ViewModel живет до тех пор, пока жив связанный с ним Scope (например, Activity). При завершении Scope ViewModel уничтожается.
ViewModelProviders (сейчас ViewModelProvider) использовался для получения экземпляра ViewModel до Kotlin. В Kotlin рекомендуется использовать ViewModelProvider(this).get(MyViewModel::class.java).
Основные преимущества ViewModel перед обычными классами для хранения UI-состояния:
- Переживает изменения конфигурации.
- Управляется фреймворком жизненного цикла Jetpack.
Недостатки:
- Может стать слишком большой при сложной UI-логике.
- Не должен содержать ссылок на View, Context или другие объекты с жизненным циклом, чтобы избежать утечек памяти.