Sobes.tech
Junior

Vorbește despre Jetpack ViewModel.

sobes.tech AI

Răspuns de la AI

ViewModel este un component Jetpack proiectat pentru a stoca și gestiona datele legate de UI. Scopul său principal este de a păstra datele UI în timpul schimbărilor de configurație, cum ar fi rotirea ecranului, și de a supraviețui ciclului de viață al Activity sau Fragment.

Caracteristici ale ViewModel:

  • Stocarea datelor: Supraviețuiește schimbărilor de configurație și chiar morții Activity sau Fragment, restaurând datele la recreare.
  • Separarea logicii: Separă logica de pregătire a datelor pentru UI de UI-ul în sine (Activity/Fragment).
  • Legătura cu ciclul de viață: Este asociat cu ciclul de viață al Activity sau Fragment.
  • Prevenirea scurgerilor de memorie: Nu menține referințe directe la View, Lifecycle sau Activity/Fragment, prevenind scurgerile de memorie.

Cum se folosește:

  1. Creați o clasă care moștenește de la ViewModel.

    class MyViewModel : ViewModel() {
        private val _data = MutableLiveData<String>()
        val data: LiveData<String> = _data
    
        init {
            // Inițializarea datelor
        }
    
        fun fetchData() {
            // Logica de încărcare a datelor
            _data.value = "Date încărcate"
        }
    
        override fun onCleared() {
            // Curățarea resurselor
            super.onCleared()
        }
    }
    
  2. Obțineți o instanță de ViewModel într-o Activity sau Fragment.

    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 ->
                // Actualizarea UI
            })
    
            viewModel.fetchData()
        }
    }
    
  3. Folosiți ViewModelProvider.Factory pentru a crea instanțe de ViewModel cu dependențe.

    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("Clasa ViewModel necunoscută")
        }
    }
    
    // În Activity/Fragment
    // val repository = MyRepository() // Injecție de dependențe
    // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
    

Comparativ cu onSaveInstanceState():

Caracteristică ViewModel onSaveInstanceState()
Supraviețuire la schimbări de configurație Da Da (pentru volume mici de date)
Supraviețuire la proces Nu (datele se pierd după distrugerea procesului) Da (pentru volume mici de date)
Stocarea datelor Obiecte, LiveData Bundle (primitiv, Serializable, Parcelable)
Evitarea scurgerilor de memorie Nu (dacă este utilizat corect) Posibil dacă se păstrează referințe la Activity/View
Complexitatea implementării Mai complex pentru scenarii simple Mai simplu pentru scenarii simple

ViewModel ajută la crearea de aplicații mai robuste și mai ușor de testat, separând UI-ul de logica de procesare a datelor.