Firebase Fonctionnalités en mode Hors connexion et addListenerForSingleValueEvent
Chaque fois que j'utilise addListenerForSingleValueEvent
avec setPersistenceEnabled(true)
, j'ai seulement réussi à obtenir un local de copie hors connexion de DataSnapshot
et PAS la mise à jour DataSnapshot
à partir du serveur.
Cependant, si j'utilise addValueEventListener
avec setPersistenceEnabled(true)
, je peux obtenir la dernière copie de DataSnapshot
à partir du serveur.
Est-ce normal pour addListenerForSingleValueEvent
qu'il cherche seulement DataSnapshot
localement (hors ligne) et supprime son port d'écoute après avoir réussi à récupérer DataSnapshot
une FOIS (soit hors ligne ou en ligne)?
Vous devez vous connecter pour publier un commentaire.
Fonctionne de persistance
La Firebase client de conserver une copie de toutes les données que vous êtes à l'écoute active dans la mémoire. Une fois le dernier auditeur se déconnecte, les données sont vidées de la mémoire.
Si vous activez le disque de la persistance dans un Firebase application Android avec:
La Firebase client de conserver une copie en local (sur le disque) de toutes les données que l'application a récemment écouté.
Ce qui se passe quand vous attacher un écouteur
Dire que vous avez l'suivantes
ValueEventListener
:Lorsque vous ajoutez un
ValueEventListener
à un emplacement:Si la valeur de l'emplacement est dans le disque local cache, le Firebase client va appeler
onDataChange()
immédiatement pour que la valeur du cache local. Si sera alors également lancer une vérification avec le serveur, pour demander les mises à jour de la valeur. Il peut invoquer ultérieurementonDataChange()
à nouveau s'il y a eu un changement de données sur le serveur depuis qu'il a été ajouté à la cache.Ce qui se passe lorsque vous utilisez
addListenerForSingleValueEvent
Lorsque vous ajoutez une valeur unique de l'écouteur d'événement à l'emplacement même:
La Firebase client (comme dans la situation précédente) immédiatement appeler
onDataChange()
de la valeur à partir du disque local cache. Il pas invoquer laonDataChange()
toute fois de plus, même si la valeur sur le serveur s'avère être différent. Notez que la mise à jour des données seront toujours demandés et rendus sur les demandes ultérieures.Cette question a été abordée précédemment dans Comment Firebase de synchroniser les travaux, avec un partage des données?
Solution et une solution de contournement
La meilleure solution est d'utiliser
addValueEventListener()
, au lieu d'une valeur unique de l'écouteur d'événement. Une valeur régulièrement l'auditeur va avoir à la fois le local immédiat de l'événement et le potentiel de mise à jour à partir du serveur.Comme une solution de contournement, vous pouvez également appeler
keepSynced(true)
sur les lieux où vous utilisez une seule valeur de l'écouteur d'événement. Cela garantit que les données sont mises à jour à chaque changement, ce qui améliore considérablement les chances que votre valeur unique de l'écouteur d'événement verra la valeur actuelle.keepSynced(true)
et puis, à l'aide de.addListenerForSingleValueEvent(listener);
ne fonctionne pas lorsque l'application est ouverte pour la première fois après un changement de base de données. Il faut de l'ouverture de l'application deux fois avant que la modification est enregistrée.Vous pouvez créer de la transaction et l'annuler, puis onComplete sera appelée lorsque en ligne (nline de données) ou hors ligne (mise en cache de données)
J'ai déjà créé une fonction qui a travaillé uniquement si la base de données eu de connexion lomng assez pour faire la synchro. J'ai corrigé le problème en ajoutant délai d'attente. Je vais travailler sur ce point et tester si cela fonctionne. Peut-être que dans le futur, quand j'aurai du temps libre, je vais créer android lib et de le publier, mais c'est le code de kotlin:
Dans le code, si le temps est réglé puis-je configurer le minuteur d'appel de la transaction à annuler. Cette opération sera appelé même en mode hors connexion et en ligne ou de la mise en cache des données (dans cette fonction il y a vraiment de grandes chances pour que ces données sont mises en cache un).
Puis j'appelle la transaction avec succès.
OnComplete
sera appelée que si nous avons obtenu de réponse à partir de firebase base de données. Nous pouvons maintenant annuler la minuterie (si ce n'est nulle) et d'envoyer des données à la fonction de rappel.Cette mise en œuvre fait dev 99% assurer que les données sont stockées dans la mémoire cache ou est en ligne.
Si vous voulez le rendre plus rapide en mode hors connexion (à ne pas attendre bêtement avec délai d'attente lors de toute évidence de la base de données n'est pas connecté) puis vérifiez si la base de données est connecté avant d'utiliser la fonction ci-dessus:
Quand workinkg avec persistance activé, j'ai compté le temps à l'auditeur a reçu un appel pour onDataChange() et arrêté d'écouter à 2 fois. A fonctionné pour moi, peut-être aide: