Sobes.tech
Junior

Räägi Jetpack ViewModel-ist.

sobes.tech AI

Vastus AI-lt

ViewModel on Jetpack komponent, mis on mõeldud andmete salvestamiseks ja haldamiseks kasutajaliidese viisil. Selle põhieesmärk on säilitada kasutajaliidese andmed konfiguratsioonimuutuste ajal, näiteks ekraani pööramisel, ning ellu jääda Activity või Fragment elutsükli jooksul.

ViewModel'i omadused:

  • Andmete säilitamine: Ellu jääb konfiguratsioonimuutuste ja isegi Activity/Fragment surma korral, taastades andmed uuesti loomisel.
  • Loogika eraldamine: Eraldab andmete ettevalmistamise loogika kasutajaliidesest (Activity/Fragment).
  • Elutsükli tugi: Seotud Activity või Fragment'i elutsükliga.
  • Vältib mälulekkeid: Ei oma otsest viidet View, Lifecycle või Activity/Fragment'ile, mis takistab mälulekkeid.

Kuidas kasutada:

  1. Looge klass, mis pärib ViewModel-ist.

    class MyViewModel : ViewModel() {
        private val _data = MutableLiveData<String>()
        val data: LiveData<String> = _data
    
        init {
            // Andmete initsialiseerimine
        }
    
        fun fetchData() {
            // Andmete laadimise loogika
            _data.value = "Laaditud andmed"
        }
    
        override fun onCleared() {
            // Ressursside puhastamine
            super.onCleared()
        }
    }
    
  2. Saage ViewModel eksemplar Activity või Fragment'i kaudu.

    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 ->
                // Kasutajaliidese uuendamine
            })
    
            viewModel.fetchData()
        }
    }
    
  3. Kasutage ViewModelProvider.Factory-d, et luua ViewModel sõltuvustega.

    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("Tundmatu ViewModel klass")
        }
    }
    
    // Activity/Fragment
    // val repository = MyRepository() // sõltuvuse süstimine
    // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
    

Võrdlus on onSaveInstanceState()-ga:

Omadus ViewModel onSaveInstanceState()
Konfiguratsiooni muutuste ellujäämine Jah Jah (väikese andmemahtude jaoks)
Protsessi ellujäämine Ei (pärast protsessi hävimist andmed kaovad) Jah (väikese andmemahtude jaoks)
Andmete salvestamine Objekti, LiveData Bundle (primitiivid, Serializable, Parcelable)
Mälulekkeid Ei (õige kasutamise korral) Võimalikud, kui hoitakse viiteid Activity/View-ile
Rakendamise keerukus Raskem lihtsate stsenaariumide jaoks Lihtsam lihtsate stsenaariumide jaoks

ViewModel aitab luua stabiilsemaid ja kergemini testitavaid rakendusi, eraldades UI andmetöötlusloogikast.