Junior
131
questionbank
Расскажи о Jetpack ViewModel.
Answer from AI
sobes.tech AI
ViewModel — это компонент Jetpack, предназначенный для хранения и управления данными UI-связанным способом. Его основная цель — сохранять данные UI во время изменений конфигурации, таких как поворот экрана, и переживать жизненный цикл Activity или Fragment.
Особенности ViewModel:
- Сохранение данных: Переживает изменения конфигурации и даже смерть Activity/Fragment, восстанавливая данные при пересоздании.
- Отделение логики: Отделяет логику подготовки данных для UI от самого UI (Activity/Fragment).
- Лайфсайкл-оруженность: Связан с жизненным циклом Activity или Fragment.
- Исключение утечек памяти: Не имеет прямой ссылки на View, Lifecycle или Activity/Fragment, что предотвращает утечки памяти.
Как использовать:
-
Создайте класс, наследующий
ViewModel.class MyViewModel : ViewModel() { private val _data = MutableLiveData<String>() val data: LiveData<String> = _data init { // Инициализация данных } fun fetchData() { // Логика загрузки данных _data.value = "Загруженные данные" } override fun onCleared() { // Очистка ресурсов super.onCleared() } } -
Получите экземпляр ViewModel в Activity или Fragment.
class MyActivity : AppCompatActivity() { private lateinit var viewModel: MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) viewModel = ViewModelProvider(this).get(MyViewModel::class.java) viewModel.data.observe(this, Observer { newData -> // Обновление UI }) viewModel.fetchData() } } -
Используйте
ViewModelProvider.Factoryдля создания экземпляров ViewModel с зависимостями.class MyViewModel(private val repository: MyRepository) : ViewModel() { // ... } class MyViewModelFactory(private val repository: MyRepository) : ViewModelProvider.Factory { override fun <T : ViewModel> create(modelClass: Class<T>): T { if (modelClass.isAssignableFrom(MyViewModel::class.java)) { @Suppress("UNCHECKED_CAST") return MyViewModel(repository) as T } throw IllegalArgumentException("Unknown ViewModel class") } } // В Activity/Fragment // val repository = MyRepository() // Инъекция зависимости // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
Сравнение с onSaveInstanceState():
| Характеристика | ViewModel | onSaveInstanceState() |
|---|---|---|
| Переживание конфиг. изм. | Да | Да (для небольших объемов данных) |
| Переживание процесса | Нет (после уничтожения процесса данные теряются) | Да (для небольших объемов данных) |
| Хранение данных | Объекты, LiveData | Bundle (примитивы, Serializable, Parcelable) |
| Утечки памяти | Нет (при правильном использовании) | Возможно при хранении ссылок на Activity/View |
| Сложность реализации | Сложнее для простых сценариев | Проще для простых сценариев |
ViewModel помогает создавать более устойчивые и легко тестируемые приложения, отделяя UI от логики обработки данных.