Ich verwende jetzt die neuesten Android-Architekturkomponenten und insbesondere das ViewModel und LiveData.LiveData - Verwenden von SingleLiveEvent mit Transformationen
Ich bin in einem Fall, in dem SingleLiveEvent vorgeschlagen here ist relevant, d. H. Ich gebe einen Fehler zurück und ich möchte eine Warnung nur einmal anzeigen. Bevor ich einen Wert für die Aktivität ausgeben kann, muss ich meinen Fehler einem geeigneteren Objekt für die Ansicht zuordnen. Ich benutze eine Transformation dafür.
Also am Ende habe ich ein Ansichtsmodell, das wie folgt aussieht:
public LiveData<ViewState> getStateForView() {
final LiveData<NetworkState> liveState = myRepository.getState();
return Transformations.map(liveState, myMapper::map);
}
Wo in meinem Repository ich ein SingleLiveEvent bin mit:
public LiveData<NetworkState> getState() {
myNetworkState = new SingleLiveEvent<>();
return myNetworkState;
}
Diese ziemlich gut funktioniert, aber ich merke, dass mein Ereignis wird nicht die ganze Zeit weitergegeben, wenn sich die Ausrichtung mehrmals ändert. Beim Debuggen, habe ich festgestellt, dass es keine Symmetrie zwischen dem Beobachter Registrierung und Entfernung:
- zum Zeitpunkt der Registrierung der Betrachter meiner SingleLiveEvent ist der anonyme Beobachter Klasse in meinem SingleLiveEvent
- zum Zeitpunkt der Entfernung der Beobachter von meinem SingleLiveEvent entfernt werden soll, ist ein MediatorLiveData (die tatsächlich die frühere anonyme Klasse in meinem SingleLiveEvent beobachtet)
Was nie von den Beobachtern des SingleLiveEvent (also wenn Ausrichtung ändert mehrmals mein SingleLiveEvent hat mehrere Beobachter) entfernt wird, ist, dass mein erster Beobachter geschieht.
Ich kann nicht herausfinden, warum dies nicht derselbe Beobachter zum Zeitpunkt der Entfernung ist. Wenn es ohne einen Transformationsschritt reproduziert wird, gibt es kein solches Problem.
Hat jemand einen Hinweis auf dieses Verhalten? Sind SingleLiveEvent (nicht Teil des Frameworks) und Transformationen nicht zusammen gedacht?