Mise à jour
Il existe en fait plusieurs façons de résoudre ce problème. Elles sont bien résumées dans cet article. LiveData avec SnackBar, Navigation et autres événements (le cas SingleLiveEvent) . Ce texte est écrit par un collègue Googler qui travaille dans l'équipe des composants d'architecture.
TL;DR Une approche plus robuste consiste à utiliser un Classe d'enveloppe d'événement dont vous pouvez voir un exemple au bas de l'écran. l'article .
Ce modèle a fait son chemin dans de nombreux échantillons Android, par exemple :
Pourquoi un wrapper d'événement est-il préféré à SingleLiveEvent ?
Un problème avec SingleLiveEvent est que s'il y a plusieurs observateurs d'un SingleLiveEvent, seul l'un d'entre eux sera notifié lorsque les données ont changé - cela peut introduire des bogues subtils et est difficile à contourner.
En utilisant une classe enveloppe d'événement, tous vos observateurs seront notifiés comme d'habitude. Vous pouvez alors choisir soit de "gérer" explicitement le contenu (le contenu n'est "géré" qu'une seule fois), soit de consulter le contenu, ce qui renvoie toujours le dernier "contenu". Dans l'exemple du dialogue, cela signifie que vous pouvez toujours voir quel était le dernier message avec peek
mais assurez-vous que pour chaque nouveau message, la boîte de dialogue n'est déclenchée qu'une seule fois, en utilisant la fonction getContentIfNotHandled
.
Ancienne réponse
La réponse d'Alex dans les commentaires est, je pense, exactement ce que vous recherchez. Il y a un exemple de code pour une classe appelée SingleLiveEvent . L'objectif de cette classe est décrit comme suit :
Un observable qui tient compte du cycle de vie et qui envoie seulement les nouvelles mises à jour après que abonnement, utilisé pour des événements tels que la navigation et les messages Snackbar.
Ceci permet d'éviter un problème courant avec les événements : lors d'un changement de configuration (comme la rotation), une mise à jour peut être émise si l'observateur est actif. Ce LiveData n'appelle l'observable que s'il y a un appel explicite à setValue() ou call().
2 votes
Ceci est lié à : stackoverflow.com/questions/44146081/
0 votes
Est-ce que cela est lié au problème des données en direct ? L'activité sera recréée à chaque rotation, que vous ayez utilisé LiveData ou non. Le problème persiste même si vous le supprimez.
1 votes
@LongRanger cela peut être résolu en supprimant le message mis en cache dans LiveData après l'affichage du dialogue, afin que la nouvelle activité ne le reçoive pas. Le même principe a été utilisé pour l'application Moxy's OneExecutionStateStrategy