Sobes.tech
Junior

Erzählen Sie mir von Jetpack ViewModel.

sobes.tech KI

Antwort von AI

ViewModel speichert und verwaltet UI-bezogene Daten unter Berücksichtigung des Lebenszyklus. Es überlebt Konfigurationsänderungen (z.B. Bildschirmrotationen, Layout-Änderungen), um Datenverlust zu vermeiden.

Wichtige Merkmale:

  • Datenspeicherung: Das ViewModel wird bei Konfigurationsänderungen nicht zerstört und bewahrt den UI-Zustand.
  • Trennung von Logik und UI: Geschäftslogik wird im ViewModel platziert, was Tests und Wartung von Activity/Fragment erleichtert.
  • Integration mit LiveData: Wird häufig mit LiveData verwendet, um Datenänderungen zu beobachten.

Anwendungsbeispiel:

// MyViewModel.kt
import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {
    // Daten, die bei Konfigurationsänderungen erhalten bleiben sollen
    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)

        // ViewModel erhalten
        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

        counterText = findViewById(R.id.counter_text)
        incrementButton = findViewById(R.id.increment_button)

        // Daten aus ViewModel anzeigen
        updateCounterDisplay()

        incrementButton.setOnClickListener {
            viewModel.counter++
            updateCounterDisplay()
        }
    }

    private fun updateCounterDisplay() {
        counterText.text = viewModel.counter.toString()
    }
}

Lebensdauer: Das ViewModel lebt so lange, wie der zugehörige Scope (z.B. Activity) lebt. Bei Beendigung des Scopes wird das ViewModel zerstört.

ViewModelProviders (jetzt ViewModelProvider) wurde früher verwendet, um eine Instanz des ViewModels zu erhalten. In Kotlin wird empfohlen, ViewModelProvider(this).get(MyViewModel::class.java) zu verwenden.

Hauptvorteile des ViewModel gegenüber normalen Klassen zur Speicherung des UI-Zustands:

  • Überlebt Konfigurationsänderungen.
  • Wird vom Jetpack-Lifecycle-Framework verwaltet.

Nachteile:

  • Kann bei komplexer UI-Logik zu groß werden.
  • Sollte keine Referenzen auf View, Context oder andere lifecycle-abhängige Objekte enthalten, um Speicherlecks zu vermeiden.