Junior
Pasakok apie Jetpack ViewModel.
sobes.tech AI
Atsakymas iš AI
ViewModel — tai Jetpack komponentas, skirtas saugoti ir valdyti duomenis UI būdu. Jo pagrindinis tikslas — išsaugoti UI duomenis keičiant konfigūraciją, pvz., ekrano pasukimą, ir išgyventi Activity ar Fragment gyvavimo ciklą.
ViewModel ypatybės:
- Duomenų išsaugojimas: Išgyvena konfigūracijos pokyčius ir net Activity/Fragment mirtį, atkuria duomenis perkrovimo metu.
- Logikos atskyrimas: Atskiria duomenų paruošimo logiką nuo UI (Activity/Fragment).
- Gyvenimo ciklo palaikymas: Susijęs su Activity ar Fragment gyvavimo ciklu.
- Atlieka atminties nutekėjimų prevenciją: Neturi tiesioginio ryšio su View, Lifecycle ar Activity/Fragment, kas užkerta kelią atminties nutekėjimams.
Kaip naudoti:
-
Sukurkite klasę, kuri paveldi
ViewModel.class MyViewModel : ViewModel() { private val _data = MutableLiveData<String>() val data: LiveData<String> = _data init { // Duomenų inicializavimas } fun fetchData() { // Duomenų įkėlimo logika _data.value = "Įkelti duomenys" } override fun onCleared() { // Išteklių valymas super.onCleared() } } -
Gaukite ViewModel egzempliorių Activity ar 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 -> // UI atnaujinimas }) viewModel.fetchData() } } -
Naudokite
ViewModelProvider.Factorykurdami ViewModel su priklausomybėmis.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("Nežinoma ViewModel klasė") } } // Activity/Fragment // val repository = MyRepository() // priklausomybės injekcija // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
Palyginimas su onSaveInstanceState():
| Charakteristika | ViewModel | onSaveInstanceState() |
|---|---|---|
| Konfigūracijų pokyčių išgyvenimas | Taip | Taip (mažiems duomenų kiekiams) |
| Procesų išgyvenimas | Ne (po proceso sunaikinimo duomenys prarandami) | Taip (mažiems duomenų kiekiams) |
| Duomenų saugojimas | Objektai, LiveData | Bundle (primitivai, Serializable, Parcelable) |
| Atminties nutekėjimai | Ne (teisingai naudojant) | Galimi, saugant nuorodas į Activity/View |
| Įgyvendinimo sudėtingumas | Sudėtingesnis paprastiems scenarijams | Paprastesnis paprastiems scenarijams |
ViewModel padeda kurti stabilesnes ir lengviau testuojamas programas, atskirdamas UI nuo duomenų apdorojimo logikos.