Junior
Papaskink apie Jetpack ViewModel.
sobes.tech AI
Atsakymas iš AI
ViewModel saugo ir valdo UI susijusius duomenis, atsižvelgiant į gyvenimo ciklą. Jis išlieka po konfigūracijos pakeitimų (ekrano pasukimo, išdėstymo pakeitimų), išvengdamas duomenų praradimo.
Pagrindinės savybės:
- Duomenų išsaugojimas: ViewModel nėra sunaikinamas konfigūracijos pakeitimų metu, išlaiko UI būseną.
- Logikos atskyrimas nuo UI: Verslo logika yra įdedama į ViewModel, tai palengvina testavimą ir palaikymą Activity/Fragment.
- Integracija su LiveData: Dažnai naudojama su LiveData stebėti duomenų pokyčius.
Pavyzdys:
// MyViewModel.kt
import androidx.lifecycle.ViewModel
class MyViewModel : ViewModel() {
// Duomenys, kuriuos reikia išsaugoti konfigūracijos pakeitimo metu
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)
// Gauti ViewModel
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
counterText = findViewById(R.id.counter_text)
incrementButton = findViewById(R.id.increment_button)
// Rodyti duomenis iš ViewModel
updateCounterDisplay()
incrementButton.setOnClickListener {
viewModel.counter++
updateCounterDisplay()
}
}
private fun updateCounterDisplay() {
counterText.text = viewModel.counter.toString()
}
}
Gyvavimo trukmė: ViewModel gyvena tol, kol gyvas susietas Scope (pvz., Activity). Kai Scope baigiasi, ViewModel sunaikinamas.
ViewModelProviders (dabar – ViewModelProvider) buvo naudojamas gauti ViewModel egzempliorių iki Kotlin. Kotlin rekomenduojama naudoti ViewModelProvider(this).get(MyViewModel::class.java).
Pagrindiniai pranašumai prieš įprastus klases UI būsenos saugojimui:
- Išlieka po konfigūracijos pakeitimų.
- Valdomas Jetpack gyvenimo ciklo framework.
Trūkumai:
- Gali tapti per didelis sudėtingai UI logikai.
- Neturėtų turėti nuorodų į View, Context ar kitus gyvenimo ciklo objektus, kad išvengtumėte atminties nutekėjimų.