8

Nach LiveData documentation:Wie LiveData gespeicherten Wert löschen?

Die Livedata-Klasse bietet die folgenden Vorteile:

...

Immer up to date Daten: Wenn ein Lifecycle wieder startet (wie eine Tätigkeit geht zurück von dem Backstack in den gestarteten Status), erhält es die neuesten Standortdaten (falls nicht schon).

Aber manchmal brauche ich diese Funktion nicht.

Zum Beispiel habe ich folgende Livedata in Ansichtsmodell und Beobachtern in Aktivität:

//LiveData 
val showDialogLiveData = MutableLiveData<String>() 

//Activity 
viewModel.showMessageLiveData.observe(this, android.arch.lifecycle.Observer { message -> 
     AlertDialog.Builder(this) 
       .setMessage(message) 
       .setPositiveButton("OK") { _, _ -> } 
       .show() 
    }) 

nun nach jeder Drehung alter Dialog erscheint.

Gibt es eine Möglichkeit, gespeicherten Wert zu löschen, nachdem es behandelt wurde oder ist die Verwendung von LiveData überhaupt falsch?

+2

ist dies im Zusammenhang mit: https://stackoverflow.com/questions/44146081/show-dialog-from-viewmodel-in-android-mvvm-architecture –

+0

es auf das Live-Daten Problem im Zusammenhang Hat? Die Aktivität wird jedes Mal neu erstellt, wenn Sie gedreht haben, unabhängig davon, ob Sie LiveData verwendet haben oder nicht. Das Problem wird fortgesetzt, selbst wenn Sie es entfernen. –

+0

@LongRanger kann durch das Löschen von Nachrichten gelöst werden, die in LiveData zwischengespeichert wurden, nachdem das Dialogfeld angezeigt wurde, sodass neue Aktivitäten es nicht empfangen können. Das gleiche Prinzip wie bei Moxys [OneExecutionStateStrategy] (https://github.com/Arello-Mobile/Moxy/wiki/View-commands-state-strategie#existing-strategies) – Kamer358

Antwort

12

Alex Antwort in den Kommentaren ist ich denke genau, was Sie suchen. Es gibt Beispielcode für eine Klasse namens SingleLiveEvent. Der Zweck dieser Klasse wird wie folgt beschrieben:

Ein Lifecycle-aware beobachtbar, dass nur neue Updates nach Abonnement sendet, für Veranstaltungen wie Navigation und Snackbar Nachrichten verwendet.

Dies vermeidet ein häufiges Problem mit Ereignissen: Bei Konfigurationsänderung (wie Rotation) kann eine Aktualisierung ausgegeben werden, wenn der Beobachter aktiv ist. Diese LiveData ruft die Observable nur auf, wenn explizit setValue() oder call() aufgerufen wird.

Verwandte Themen