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:
-
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() } } -
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() } } -
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.