Junior
Spune-mi despre Jetpack ViewModel.
sobes.tech AI
Răspuns de la AI
ViewModel stochează și gestionează datele legate de UI ținând cont de ciclul de viață. Supraviețuiește schimbărilor de configurație (cum ar fi rotațiile ecranului, modificările de aspect), evitând pierderea datelor.
Caracteristici cheie:
- Salvarea datelor: ViewModel nu este distrus în timpul schimbărilor de configurație, păstrând starea UI.
- Separarea logicii de UI: Logica de business este plasată în ViewModel, ceea ce facilitează testarea și întreținerea Activity/Fragment.
- Integrare cu LiveData: Adesea folosit cu LiveData pentru a observa modificările datelor.
Exemplu de utilizare:
// MyViewModel.kt
import androidx.lifecycle.ViewModel
class MyViewModel : ViewModel() {
// Date care trebuie păstrate în timpul schimbărilor de configurație
var counter = 0
}
// MyActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.lifecycle.ViewModelProvider
class MyActivity : AppCompatActivity() {
private lateinit var viewModel: MyViewModel
private lateinit var counterText: TextView
private lateinit var incrementButton: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Obținerea ViewModel
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
counterText = findViewById(R.id.counter_text)
incrementButton = findViewById(R.id.increment_button)
// Afișarea datelor din ViewModel
updateCounterDisplay()
incrementButton.setOnClickListener {
viewModel.counter++
updateCounterDisplay()
}
}
private fun updateCounterDisplay() {
counterText.text = viewModel.counter.toString()
}
}
Durata de viață: ViewModel trăiește atât timp cât Scope-ul asociat (de exemplu, Activity) este în viață. Când Scope-ul se încheie, ViewModel-ul este distrus.
ViewModelProviders (acum ViewModelProvider) era folosit pentru a obține o instanță de ViewModel înainte de Kotlin. În Kotlin, se recomandă utilizarea ViewModelProvider(this).get(MyViewModel::class.java).
Principalele avantaje ale ViewModel față de clasele obișnuite pentru stocarea stării UI:
- Supraviețuiește schimbărilor de configurație.
- Este gestionat de cadrul de cicl de viață Jetpack.
Dezavantaje:
- Poate deveni prea mare cu logică UI complexă.
- Nu trebuie să conțină referințe la View, Context sau alte obiecte cu cicl de viață pentru a evita scurgerile de memorie.