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.