Junior
Разкажи за Jetpack ViewModel.
sobes.tech AI
Отговор от 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("Неизвестен клас на ViewModel") } } // В 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 от логиката за обработка на данни.