【Jetpack】LiveData

1 Was ist der Unterschied zwischen setValue() und postValue()?
2 Wie nimmt liveData den Lebenszyklus wahr?
3 Warum verliert Continuous postValue() Daten?
4 Sind Livedaten „sticky“?
5 Warum sind Livedaten so konzipiert, dass sie dauerhaft bleiben?

1. Was ist LiveData?

Beobachtbare Datenspeicherklassen mit bewusster Lebensdauer

2. LiveData-Nutzungsszenarien

Bei Verwendung im ViewModel steuern die Daten die Aktualisierung der Ansicht durch den Beobachter und senken so den Schwellenwert von MVVM.

3. Vorteile von LiveData

Wahrnehmung Lebenszyklus

  • Verfolgen Sie den Lebenszyklus anderer Anwendungskomponenten wie Aktivität, Fragment oder Dienst. Dieses Bewusstsein stellt sicher, dass LiveData nur App-Komponenten-Beobachter aktualisiert, die sich in einem aktiven Lebenszyklusstatus befinden.
  • LiveData betrachtet einen Beobachter (dargestellt durch die Observer-Klasse) als aktiv, wenn sich sein Lebenszyklus im Status STARTED oder RESUMED befindet. LiveData benachrichtigt nur aktive Beobachter über Aktualisierungen. Inaktive Beobachter, die zur Beobachtung von LiveData-Objekten registriert sind, werden nicht über Änderungen benachrichtigt.
    Stellen Sie sicher, dass die Schnittstelle dem Stand der Daten entspricht und die Daten immer aktuell sind
  • Um sicherzustellen, dass die Daten auf dem neuesten Stand sind, besteht der Zweck von LiveData darin, sicherzustellen, dass das letzte Datenelement auf dem neuesten Stand ist. Daher ist es normal, dass Daten verloren gehen, wenn die Daten geändert werden (das Szenario von kontinuierliche Verwendung von postValue()). Schließlich garantiert es nur die letzten Daten.
  • Auch entsprechende Konfigurationsänderungen können die Aktualität der Daten gewährleisten. Wenn eine Aktivität oder ein Fragment aufgrund einer Konfigurationsänderung, beispielsweise einer Geräterotation, neu erstellt wird, erhält es sofort die neuesten verfügbaren Daten. ViewModel hat einen relativ langen Lebenszyklus und wird in diesem Szenario gespeichert. Nach dem Wechsel wird die interne Version von Livedata beurteilt, um sicherzustellen, dass die Daten auf dem neuesten Stand sind.
    Es treten keine Speicherlecks auf, es kommt nicht zu Abstürzen aufgrund des Stopps der Aktivität und es ist nicht erforderlich, den Lebenszyklus manuell zu verwalten
  • Der Beobachter von Livedata ist an das Lifecycle-Objekt gebunden. Beim Beenden übernimmt er automatisch die Aufhebung der Bindung.
    Gemeinsam genutzte Ressourcen
  • Sie können das LiveData-Objekt mithilfe des Singleton-Musters erweitern, um Systemdienste zu kapseln, sodass sie anwendungsübergreifend gemeinsam genutzt werden können. Ein LiveData-Objekt stellt einmal eine Verbindung zum Systemdienst her, und dann beobachtet jeder Beobachter, der die entsprechende Ressource benötigt, einfach das LiveData-Objekt. Weitere Informationen finden Sie unter Erweitern von LiveData.

4. Grundlegende Verwendung

Schritt 1 Deklarieren Sie ein LiveData

class NameViewModel : ViewModel() {
    
    

    val currentName: MutableLiveData<String> by lazy {
    
    
        MutableLiveData<String>()
    }
}

Schritt 2: Abonnement starten

beobachten und observForever

class NameActivity : AppCompatActivity() {
    
    

    // Use the 'by viewModels()' Kotlin property delegate
    // from the activity-ktx artifact
    private val model: NameViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
    
    
        super.onCreate(savedInstanceState)

        // Other code to setup the activity...

        // Create the observer which updates the UI.
        val nameObserver = Observer<String> {
    
     newName ->
            // Update the UI, in this case, a TextView.
            nameTextView.text = newName
        }

        // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
        model.currentName.observe(this, nameObserver)

        model.currentName.observe(this) {
    
    
            Log.d("TAG", "LiveData: $it")
        }

        model.currentName.observeForever {
    
    
            Log.d("TAG", "Forever LiveData: $it")
        }
    }
}

Schritt 3: Daten aktualisieren

setValue und postValue

//主线程调用 setValue()
model.currentName.setValue(anotherName)
//子线程调用 postValue()
model.currentName.postValue(anotherName)

5. Vorsichtsmaßnahmen

5.1 setValue() muss sich im Hauptthread befinden

java.lang.IllegalStateException: setValue kann nicht für einen Hintergrundthread aufgerufen werden

5.2 Wenn Sie postValue () kontinuierlich aufrufen, wird der Zwischenwert verworfen

Es sollte auf Szenarien geachtet werden, bei denen der Wertstatus jedes Mal abgerufen werden muss, z. B. die Überwachung des Fortschrittsbalkens usw.

5.3 LiveData-Datenrückflussproblem

LiveData ist standardmäßig sticky, was durch Ändern von mLastVersion erreicht werden kann

Guess you like

Origin blog.csdn.net/Android_yh/article/details/130303773