Junior
Erzählen Sie über Jetpack ViewModel.
sobes.tech KI
Antwort von AI
ViewModel ist eine Komponente von Jetpack, die zum Speichern und Verwalten von UI-bezogenen Daten entwickelt wurde. Sein Hauptziel ist es, UI-Daten während Konfigurationsänderungen wie Bildschirmrotationen zu bewahren und den Lebenszyklus von Activity oder Fragment zu überleben.
Eigenschaften des ViewModel:
- Datenspeicherung: Überlebt Konfigurationsänderungen und sogar den Tod von Activity/Fragment, indem es Daten bei der Neuerstellung wiederherstellt.
- Logiktrennung: Trennt die Logik der Datenvorbereitung für die UI von der UI selbst (Activity/Fragment).
- Lebenszyklusbindung: Ist mit dem Lebenszyklus von Activity oder Fragment verbunden.
- Vermeidung von Speicherlecks: Hält keine direkten Referenzen auf View, Lifecycle oder Activity/Fragment, was Speicherlecks verhindert.
So verwenden Sie:
-
Erstellen Sie eine Klasse, die von
ViewModelerbt.class MyViewModel : ViewModel() { private val _data = MutableLiveData<String>() val data: LiveData<String> = _data init { // Dateninitialisierung } fun fetchData() { // Logik zum Laden der Daten _data.value = "Geladene Daten" } override fun onCleared() { // Ressourcenbereinigung super.onCleared() } } -
Holen Sie sich eine Instanz von ViewModel in einer Activity oder einem 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 aktualisieren }) viewModel.fetchData() } } -
Verwenden Sie
ViewModelProvider.Factory, um Instanzen von ViewModel mit Abhängigkeiten zu erstellen.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("Unbekannte ViewModel-Klasse") } } // In der Activity/Fragment // val repository = MyRepository() // Abhängigkeitsinjektion // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
Vergleich mit onSaveInstanceState():
| Eigenschaft | ViewModel | onSaveInstanceState() |
|---|---|---|
| Überleben bei Konfigurationsänderungen | Ja | Ja (für kleine Datenmengen) |
| Überleben des Prozesses | Nein (Daten gehen bei Prozessende verloren) | Ja (für kleine Datenmengen) |
| Datenspeicherung | Objekte, LiveData | Bundle (Primitive, Serializable, Parcelable) |
| Speicherlecks vermeiden | Nein (bei korrekter Verwendung) | Möglich bei Referenzen auf Activity/View |
| Implementierungsaufwand | Komplexer für einfache Szenarien | Einfacher für einfache Szenarien |
ViewModel hilft, robustere und leichter testbare Anwendungen zu erstellen, indem UI von der Datenverarbeitungslogik getrennt wird.