Sobes.tech
Junior

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.