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

  1. 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()
        }
    }
    
  2. 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()
        }
    }
    
  3. Použite ViewModelProvider.Factory na 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.