Junior
Pastāsti par Jetpack ViewModel.
sobes.tech AI
Atbilde no AI
ViewModel — tas Jetpack komponenta, kas paredzēta datu glabāšanai un pārvaldībai UI veidā. Tā galvenais mērķis ir saglabāt UI datus konfigurācijas izmaiņu laikā, piemēram, ekrāna apgriešanas gadījumā, un izdzīvot Activity vai Fragment dzīves cikla laikā.
ViewModel īpašības:
- Datu saglabāšana: Izdzīvo konfigurācijas izmaiņas un pat Activity/Fragment nāvi, atjaunojot datus pārstartēšanas laikā.
- Loģikas atdalīšana: Atdala datu sagatavošanas loģiku no UI (Activity/Fragment).
- Dzīves cikla atbalsts: Saistīts ar Activity vai Fragment dzīves ciklu.
- Atbalsta atmiņas noplūžu novēršanu: Nav tiešas saistības ar View, Lifecycle vai Activity/Fragment, kas novērš atmiņas noplūdes.
Kā lietot:
-
Izveidojiet klasi, kas manto no
ViewModel.class MyViewModel : ViewModel() { private val _data = MutableLiveData<String>() val data: LiveData<String> = _data init { // Datu inicializācija } fun fetchData() { // Datu ielādes loģika _data.value = "Ielādētie dati" } override fun onCleared() { // Resursu tīrīšana super.onCleared() } } -
Saņemiet ViewModel eksemplāru Activity vai 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 atjaunināšana }) viewModel.fetchData() } } -
Izmantojiet
ViewModelProvider.Factory, lai izveidotu ViewModel ar atkarībām.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("Nezināma ViewModel klase") } } // Activity/Fragment // val repository = MyRepository() // atkarību injekcija // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
Salīdzinājums ar onSaveInstanceState():
| Raksturlielums | ViewModel | onSaveInstanceState() |
|---|---|---|
| Konfigurācijas izmaiņu pārziemošana | Jā | Jā (mazu datu apjomu gadījumā) |
| Procesa pārziemošana | Nē (pēc procesa iznīcināšanas dati tiek zaudēti) | Jā (mazu datu apjomu gadījumā) |
| Datu glabāšana | Objekti, LiveData | Bundle (primitiivi, Serializable, Parcelable) |
| Atmiņas noplūdes | Nē (pareizi lietojot) | Iespējamas, saglabājot atsauces uz Activity/View |
| Īstenošanas sarežģītība | Sarežģītāka vienkāršiem scenārijiem | Vienkāršāka vienkāršiem scenārijiem |
ViewModel palīdz izveidot stabilākas un vieglāk testējamas lietojumprogrammas, atdalot UI no datu apstrādes loģikas.