Junior
Porozprávaj o Jetpack ViewModel.
sobes.tech AI
Odpoveď od AI
ViewModel je komponenta Jetpack, ktorá je určená na ukladanie a správu údajov spôsobom, ktorý je spojený s používateľským rozhraním (UI). Jeho hlavný cieľ je zachovať údaje UI počas zmien konfigurácie, ako je otáčanie obrazovky, a prežiť životný cyklus Activity alebo Fragment.
Vlastnosti ViewModel:
- Ukladanie údajov: Prežíva zmeny konfigurácie a dokonca aj smrť Activity/Fragmentu, obnovujúc údaje pri opätovnom vytvorení.
- Oddelenie logiky: Oddelí logiku prípravy údajov pre UI od samotného UI (Activity/Fragment).
- Prepojenie s životným cyklom: Je prepojený s životným cyklom Activity alebo Fragmentu.
- Prevencia únikov pamäte: Nemá priame odkaz na View, Lifecycle alebo Activity/Fragment, čím zabraňuje únikom pamäte.
Ako používať:
-
Vytvorte triedu, ktorá dedí od
ViewModel.class MyViewModel : ViewModel() { private val _data = MutableLiveData<String>() val data: LiveData<String> = _data init { // Inicializácia údajov } fun fetchData() { // Logika načítania údajov _data.value = "Načítané údaje" } override fun onCleared() { // Vyčistenie zdrojov super.onCleared() } } -
Získajte inštanciu ViewModel v Activity alebo Fragments.
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 -> // Aktualizácia UI }) viewModel.fetchData() } } -
Použite
ViewModelProvider.Factoryna vytvorenie inštancií ViewModel s závislosťami.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("Neznáma trieda ViewModel") } } // V Activity/Fragment // val repository = MyRepository() // Injektovanie závislostí // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
Porovnanie s onSaveInstanceState():
| Charakteristika | ViewModel | onSaveInstanceState() |
|---|---|---|
| Prežívanie konfigurácie | Áno | Áno (pre malé objemy dát) |
| Prežívanie procesu | Nie (po ukončení procesu sú údaje stratené) | Áno (pre malé objemy dát) |
| Ukladanie údajov | Objekty, LiveData | Bundle (primitívy, Serializable, Parcelable) |
| Úniky pamäte | Nie (pri správnom použití) | Môžu sa vyskytnúť pri uchovávaní odkazov na Activity/View |
| Složitosti implementácie | Zložitejšie pre jednoduché scenáre | Jednoduchšie pre jednoduché scenáre |
ViewModel pomáha vytvárať odolnejšie a ľahšie testovateľné aplikácie, oddelením UI od logiky spracovania údajov.