Sobes.tech
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:

  1. Erstellen Sie eine Klasse, die von ViewModel erbt.

    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()
        }
    }
    
  2. 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()
        }
    }
    
  3. 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.