Sobes.tech
Junior

Beszélj a Jetpack ViewModel-ről.

sobes.tech MI

Válasz az MI-től

A ViewModel a Jetpack egyik összetevője, amely az UI-hoz kapcsolódó adatok tárolására és kezelésére szolgál. Fő célja az UI adatok megőrzése konfigurációs változások, például képernyőforgatás során, valamint az Activity vagy Fragment életciklusának túlélése során.

A ViewModel jellemzői:

  • Adatok tárolása: Átéli a konfigurációs változásokat és még az Activity/Fragment halálát is, az adatok újraállításával.
  • Logika elkülönítése: Elkülöníti az adatok előkészítésének logikáját az UI-tól (Activity/Fragment).
  • Életciklushoz kötött: Kapcsolódik az Activity vagy Fragment életciklusához.
  • Memóriaszivárgások megelőzése: Nincs közvetlen hivatkozás View-ra, Lifecycle-ra vagy Activity/Fragment-re, így megakadályozza a memóriaszivárgásokat.

Hogyan használjuk:

  1. Hozzon létre egy ViewModel-ből származó osztályt.

    class MyViewModel : ViewModel() {
        private val _data = MutableLiveData<String>()
        val data: LiveData<String> = _data
    
        init {
            // Adatok inicializálása
        }
    
        fun fetchData() {
            // Adatok betöltési logika
            _data.value = "Betöltött adatok"
        }
    
        override fun onCleared() {
            // Erőforrások tisztítása
            super.onCleared()
        }
    }
    
  2. Szerezzen be egy példányt a ViewModel-ből Activity vagy Fragment esetén.

    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 frissítése
            })
    
            viewModel.fetchData()
        }
    }
    
  3. Használja a ViewModelProvider.Factory-t a ViewModel példányok létrehozásához függőségekkel.

    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("Ismeretlen ViewModel osztály")
        }
    }
    
    // Activity/Fragment esetén
    // val repository = MyRepository() // Függőség injektálás
    // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
    

Összehasonlítás az onSaveInstanceState()-szel:

Jellemző ViewModel onSaveInstanceState()
Konfiguráció túlélése Igen Igen (kis adatmennyiség esetén)
Folyamat túlélése Nem (a folyamat megszűnése után az adatok elvesznek) Igen (kis adatmennyiség esetén)
Adatok tárolása Objektumok, LiveData Bundle (primitívek, Serializable, Parcelable)
Memóriaszivárgás Nem (helyes használat esetén) Lehetséges, ha hivatkozásokat tart fenn Activity/View-ra
Megvalósítás bonyolultsága Bonyolultabb egyszerű forgatókönyvekhez Egyszerűbb, könnyebb egyszerű forgatókönyvekhez

A ViewModel segít stabilabb és könnyebben tesztelhető alkalmazások létrehozásában, elkülönítve a UI-t a adatfeldolgozó logikától.