Junior
Porozprávaj mi o Jetpack ViewModel.
sobes.tech AI
Odpoveď od AI
ViewModel uchováva a spravuje údaje spojené s používateľským rozhraním s ohľadom na životný cyklus. Prežíva zmeny konfigurácie (otočenie obrazovky, zmeny rozloženia), čím zabraňuje strate údajov.
Kľúčové vlastnosti:
- Uloženie údajov: ViewModel sa nezničí pri zmenách konfigurácie, zachováva stav UI.
- Oddelenie logiky od UI: Obchodná logika je umiestnená vo ViewModel, čo uľahčuje testovanie a údržbu Activity/Fragment.
- Integrácia s LiveData: Často sa používa s LiveData na sledovanie zmien údajov.
Príklad použitia:
// MyViewModel.kt
import androidx.lifecycle.ViewModel
class MyViewModel : ViewModel() {
// Údaje, ktoré je potrebné zachovať pri zmene konfigurácie
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)
// Získanie ViewModel
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
counterText = findViewById(R.id.counter_text)
incrementButton = findViewById(R.id.increment_button)
// Zobrazenie údajov z ViewModel
updateCounterDisplay()
incrementButton.setOnClickListener {
viewModel.counter++
updateCounterDisplay()
}
}
private fun updateCounterDisplay() {
counterText.text = viewModel.counter.toString()
}
}
Životnosť: ViewModel žije tak dlho, ako žije priradený Scope (napríklad Activity). Pri ukončení Scope sa ViewModel zničí.
ViewModelProviders (teraz ViewModelProvider) sa používal na získanie inštancie ViewModel pred Kotlinom. V Kotlin sa odporúča používať ViewModelProvider(this).get(MyViewModel::class.java).
Hlavné výhody ViewModel oproti bežným triedam na ukladanie stavu UI:
- Prežíva zmeny konfigurácie.
- Je spravovaný rámcom životného cyklu Jetpack.
Nevýhody:
- Môže sa stať príliš veľkým pri zložitých logikách UI.
- Nemá obsahovať odkazy na View, Context alebo iné objekty s životným cyklom, aby sa predišlo únikom pamäte.