Vertel me over Jetpack ViewModel.
sobes.tech AI
Antwoord van AI
ViewModel slaat en beheert UI-gerelateerde gegevens met inachtneming van de levenscyclus. Het overleeft configuratiewijzigingen (zoals schermrotaties, lay-outwijzigingen), waardoor gegevensverlies wordt voorkomen.
Belangrijkste kenmerken:
- Gegevens opslaan: ViewModel wordt niet vernietigd bij configuratiewijzigingen en behoudt de UI-status.
- Scheiding van logica en UI: De bedrijfslogica wordt in het ViewModel geplaatst, wat testen en onderhoud van Activity/Fragment vergemakkelijkt.
- Integratie met LiveData: Wordt vaak gebruikt met LiveData om gegevenswijzigingen te observeren.
Voorbeeld van gebruik:
// MyViewModel.kt
import androidx.lifecycle.ViewModel
class MyViewModel : ViewModel() {
// Gegevens die bij configuratiewijzigingen behouden moeten blijven
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)
// Verkrijg ViewModel
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
counterText = findViewById(R.id.counter_text)
incrementButton = findViewById(R.id.increment_button)
// Gegevens uit ViewModel weergeven
updateCounterDisplay()
incrementButton.setOnClickListener {
viewModel.counter++
updateCounterDisplay()
}
}
private fun updateCounterDisplay() {
counterText.text = viewModel.counter.toString()
}
}
Levensduur: De ViewModel leeft zolang de gekoppelde Scope (bijvoorbeeld, Activity) leeft. Wanneer de Scope eindigt, wordt de ViewModel vernietigd.
ViewModelProviders (nu ViewModelProvider) werd gebruikt om een instantie van ViewModel te verkrijgen vóór Kotlin. In Kotlin wordt aanbevolen om ViewModelProvider(this).get(MyViewModel::class.java) te gebruiken.
Belangrijkste voordelen van ViewModel ten opzichte van gewone klassen voor het opslaan van UI-toestand:
- Overleeft configuratiewijzigingen.
- Wordt beheerd door het Jetpack lifecycle-framework.
Nadelen:
- Kan te groot worden bij complexe UI-logica.
- Mag geen verwijzingen bevatten naar View, Context of andere objecten met een levenscyclus om geheugenlekken te voorkomen.