Sobes.tech
Junior

Pričaj o Jetpack ViewModel.

sobes.tech АИ

Одговор од АИ

ViewModel je komponent Jetpack-a namenjen za skladištenje i upravljanje podacima na način koji je povezan sa UI-jem. Njegov glavni cilj je da čuva podatke UI tokom promena konfiguracije, kao što je rotacija ekrana, i da preživi životni ciklus Activity ili Fragment.

Karakteristike ViewModel-a:

  • Čuvanje podataka: Preživljava promene konfiguracije i čak i smrt Activity ili Fragmenta, obnavljajući podatke pri ponovnom kreiranju.
  • Odvajanje logike: Odvaja logiku pripreme podataka za UI od samog UI-ja (Activity/Fragment).
  • Povezan sa životnim ciklusom: Povezan je sa životnim ciklusom Activity ili Fragmenta.
  • Prevencija curenja memorije: Nema direktnu referencu na View, Lifecycle ili Activity/Fragment, čime se sprečava curenje memorije.

Kako koristiti:

  1. Kreirajte klasu koja nasleđuje ViewModel.

    class MyViewModel : ViewModel() {
        private val _data = MutableLiveData<String>()
        val data: LiveData<String> = _data
    
        init {
            // Inicijalizacija podataka
        }
    
        fun fetchData() {
            // Logika učitavanja podataka
            _data.value = "Učitani podaci"
        }
    
        override fun onCleared() {
            // Čišćenje resursa
            super.onCleared()
        }
    }
    
  2. Dobijte instancu ViewModel-a u Activity ili Fragmentu.

    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 ->
                // Ažuriranje UI
            })
    
            viewModel.fetchData()
        }
    }
    
  3. Koristite ViewModelProvider.Factory za kreiranje instanci ViewModel sa zavisnostima.

    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("Nepoznata klasa ViewModel")
        }
    }
    
    // U Activity/Fragment
    // val repository = MyRepository() // Injektovanje zavisnosti
    // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
    

Upoređenje sa onSaveInstanceState():

Karakteristika ViewModel onSaveInstanceState()
Preživljavanje konfiguracije Da Da (za manje količine podataka)
Preživljavanje procesa Ne (nakon zatvaranja procesa podaci se gube) Da (za manje količine podataka)
Čuvanje podataka Objekti, LiveData Bundle (primitivi, Serializable, Parcelable)
Uticaj na memoriju Ne (ako se koristi ispravno) Moguće ako se čuvaju reference na Activity/View
Složenost implementacije Složenije za jednostavne scenarije Jednostavnije za jednostavne scenarije

ViewModel pomaže u pravljenju otpornijih i lakše testiranih aplikacija, odvajajući UI od logike obrade podataka.