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:
-
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() } } -
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() } } -
Folosiți
ViewModelProvider.Factorypentru 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.