Junior
Vertel over Jetpack ViewModel.
sobes.tech AI
Antwoord van AI
ViewModel is een component van Jetpack ontworpen om UI-gerelateerde gegevens op te slaan en te beheren. Het hoofddoel is om UI-gegevens te behouden tijdens configuratiewijzigingen, zoals schermrotatie, en te overleven tijdens de levenscyclus van Activity of Fragment.
Kenmerken van ViewModel:
- Gegevensopslag: Overleeft configuratiewijzigingen en zelfs het verlies van Activity/Fragment, door gegevens te herstellen bij hercreatie.
- Logische scheiding: Scheidt de logica voor het voorbereiden van gegevens voor de UI van de UI zelf (Activity/Fragment).
- Verbinding met levenscyclus: Is gekoppeld aan de levenscyclus van Activity of Fragment.
- Voorkomen van geheugenlekken: Houdt geen directe referenties naar View, Lifecycle of Activity/Fragment, wat geheugenlekken voorkomt.
Hoe te gebruiken:
-
Maak een klasse die erft van
ViewModel.class MyViewModel : ViewModel() { private val _data = MutableLiveData<String>() val data: LiveData<String> = _data init { // Gegevensinitialisatie } fun fetchData() { // Logica voor het laden van gegevens _data.value = "Laden gegevens" } override fun onCleared() { // Resources opruimen super.onCleared() } } -
Verkrijg een instantie van ViewModel in een Activity of 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 bijwerken }) viewModel.fetchData() } } -
Gebruik
ViewModelProvider.Factoryom instanties van ViewModel te maken met afhankelijkheden.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("Onbekende ViewModel-klasse") } } // In een Activity/Fragment // val repository = MyRepository() // Afhankelijkheidsinjectie // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
Vergelijking met onSaveInstanceState():
| Kenmerk | ViewModel | onSaveInstanceState() |
|---|---|---|
| Overleven bij configuratiewijzigingen | Ja | Ja (voor kleine gegevensvolumes) |
| Overleven van het proces | Nee (gegevens gaan verloren na procesbeëindiging) | Ja (voor kleine gegevensvolumes) |
| Gegevensopslag | Objecten, LiveData | Bundle (primitieven, Serializable, Parcelable) |
| Geheugenlekken voorkomen | Nee (bij correct gebruik) | Mogelijk bij het vasthouden van referenties naar Activity/View |
| Implementatiecomplexiteit | Complexer voor eenvoudige scenario's | Eenvoudiger voor eenvoudige scenario's |
ViewModel helpt bij het maken van robuustere en beter testbare applicaties, door de UI te scheiden van de gegevensverwerkingslogica.