Sobes.tech
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:

  1. 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()
        }
    }
    
  2. 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()
        }
    }
    
  3. 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ā (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.