Es sieht so MutableLiveData
aus, als würde es sich LiveData
nur dadurch unterscheiden, dass die Methoden setValue()
und veröffentlicht postValue()
werden, während LiveData
sie geschützt sind.
Was sind einige Gründe, eine separate Klasse für diese Änderung zu erstellen und diese Methoden nicht einfach als öffentlich an LiveData
sich zu definieren?
Ist eine solche Form der Vererbung (die Erhöhung der Sichtbarkeit bestimmter Methoden ist die einzige Änderung) im Allgemeinen eine bekannte Praxis, und in welchen Szenarien kann sie nützlich sein (vorausgesetzt, wir haben Zugriff auf den gesamten Code)?
android
oop
android-architecture-components
android-livedata
Alexander Kulyakhtin
quelle
quelle
LiveData
ist unveränderlich, da der Client den internen Status nicht ändern kann, daher threadsicherAntworten:
In Livedata - Android Developer Dokumentation , können Sie sehen , dass für
LiveData
,setValue()
undpostValue()
Methoden sind nicht öffentlich.Während in MutableLiveData - Android Developer - Dokumentation , dass Sie sehen können,
MutableLiveData
erstreckt sich nachLiveData
innen und auch die beiden magischen MethodenLiveData
ist öffentlich in dieser zur Verfügung und sie sindsetValue()
&postValue()
.setValue()
: setze den Wert und versende den Wert an alle aktiven Beobachter, muss vom Haupt-Thread aufgerufen werden .postValue()
: poste eine Aufgabe an den Hauptthread, um den von festgelegten Wert zu überschreibensetValue()
, muss vom Hintergrundthread aufgerufen werden .Ist
LiveData
also unveränderlich .MutableLiveData
istLiveData
das, was veränderlich und threadsicher ist .quelle
Dies ist die gesamte
MutableLiveData.java
Datei:Also ja, der Unterschied kommt nur durch machen
postValue
undsetValue
öffentlich.Ein Anwendungsfall, an den ich mich sofort erinnern kann, ist die Kapselung mit Backing Property in Kotlin. Sie können
LiveData
sich Ihrem Fragment / Ihrer Aktivität (UI-Controller) aussetzen , obwohl Sie diesMutableLiveData
in IhrerViewModel
Klasse manipulieren können .Auf diese Weise kann Ihr UI-Controller nur Werte beobachten, ohne sie bearbeiten zu können. Offensichtlich kann Ihr UI-Controller Werte mit öffentlichen Methoden
TempViewModel
wie " Gefällt mir" bearbeitenincrementCount()
.Hinweis : Um veränderliche / unveränderliche Verwirrung zu klären -
quelle
_score
?MutableLiveData wird von LiveData erweitert. Die geschützten Methoden von LiveData können nur von sich selbst oder von Unterklassen angesprochen werden. In diesem Fall kann MutableLiveData, eine Unterklasse von LiveData, auf diese geschützten Methoden zugreifen.
Was Sie tun möchten, ist eine Instanz zu beobachten und festzustellen, ob sich Änderungen ergeben. Gleichzeitig möchten Sie jedoch nicht, dass "Außenstehende" die von Ihnen beobachtete Instanz ändern. In gewissem Sinne führt dies zu einem Problem, da Sie ein Objekt haben möchten, das geändert werden kann, um jeden neuen Status zu aktualisieren und nicht zu ändern, um sicherzustellen, dass niemand, der diese Instanz nicht aktualisieren sollte. Diese beiden Funktionen stehen in Konflikt miteinander, können jedoch durch Erstellen einer zusätzlichen Ebene gelöst werden.
Sie erweitern also Ihre Klasse LiveData um eine Klasse, die auf ihre Methoden zugreifen kann. Die Unterschicht, in diesem Fall MutableLiveData, kann auf die geschützten Methoden ihres übergeordneten Elements (/ super) zugreifen.
Jetzt erstellen Sie Instanzen und erstellen Ihre Beobachterinstanz von MutableLiveData. Gleichzeitig erstellen Sie eine LiveData-Instanz, die auf dieselbe Instanz verweist. Da MutableLiveData LiveData erweitert, ist jede MutableLiveData-Instanz ein LiveData-Objekt und kann daher von einer LiveData-Variablen referenziert werden.
Jetzt ist der Trick fast fertig. Sie machen nur die LiveData-Instanz verfügbar, niemand kann ihre geschützten Methoden verwenden oder sie in Super umwandeln (möglicherweise zur Kompilierungszeit, aber sie würde nicht ausgeführt: RunTime-Fehler). Und Sie halten die eigentliche Unterklasseninstanz privat, sodass sie nur von denjenigen geändert werden kann, denen die Instanz gehört, und zwar mithilfe der Methoden der Instanz.
Jetzt benachrichtigt die Superklasse, wenn Änderungen angewendet werden.
Ja, es ist ziemlich bekannt und dies ist ein häufiges Szenario. Entfernen Sie das Beobachtermuster und erstellen Sie es in einer Set / Get-Form. Dies würde genauso viel davon profitieren. Je nachdem, wo Sie es implementieren, gibt es am Ende keine goldenen Regeln.
quelle