Firebase ajoutant des écouteurs dans les adaptateurs dans Android

voix
7

Je suis assez nouveau à firebase et je suis en train d'envelopper ma tête autour d' elle. J'ai cet adaptateur qui enregistre à ValueEventListenerchaque fois qu'il est créé. Si je ne détache pas, les auditeurs vont ajouter que je tourne mon téléphone et l'adaptateur est détruit / reconstruit dans le fragment ?. Ou est firebase assez intelligent pour savoir que cet écouteur particulier existe déjà?

PS : J'ai essayé de désenregistrer cet écouteur dans la onPauseméthode du fragment en utilisant, mais firebase semble être enlever mon cache donc après le fragment tourne , il faut un certain temps pour récupérer les données à nouveau, qui n'a pas eu lieu avant.

Créé 08/04/2015 à 21:58
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
12

Bonne question. Donc, peu de choses à noter:

  1. Où êtes - vous apposez votre auditeur? Si vous connectez ce partout , mais la onResume, il sera ré-initialiser votre auditeur. Lors de la définition d' un auditeur , il déclenche tous les événements pour ce noeud particulier. Cependant, je fais toujours tout mon enregistrement et désinscription à ma référence dans Firebase onPauseetonResume

  2. Vous pouvez avoir plusieurs instances de tout auditeur Firebase.

    Est-firebase assez intelligent pour savoir que cet auditeur particulier existe déjà?

    Firebase est conscient que l' auditeur existe déjà et ne sera pas envoyer le même événement deux fois. Cependant, lors de la rotation que vous créez une nouvelle instance de votre auditeur. Firebase ne peut pas voir ce que le même auditeur instancié. Par conséquent, vous recevez toutes les données à nouveau.

  3. Caches Firebase toutes les données . Lorsqu'un fragment est attaché et l'auditeur est réglé, firebase fera deux appels principaux -

    • Tout d'abord - Une requête pour récupérer des données mises en cache.

    • Deuxième - Une requête aux données à distance.

    L' appel cache première est agréable car il fonctionne toujours dans les cas avec lenteur à aucun réseau. Maintenant, nu avec moi ici ... Quand Firebase reçoit cet instantané des serveurs en ligne , il fera une évaluation complexe de l'objet distant et objet local. Et au mieux de sa capacité, Firebase fusionnera les objets à l' aide d' un ID complexe qui utilise la magie noire et horodatages [source nécessaire]. Avec ce nouveau cliché, le cas échéant, il enregistrer sur les serveurs. Ensuite, ** Firebase fournira la date à vous que si elle diffère de la version mise en cache et change par rapport à l'instance de l'auditeur qui a fourni ces données. Cette structure axée sur le cache-applique même lorsque vous enregistrez vos données:

    • Cache à sauver de première.

    • Rappel de déclenchement de deuxième.

    • Tenter de sauver troisième au serveur.


Pour répondre à la question

Si vous connectez votre écouteur à Firebase onPause/ onResume, vous recevrez toutes les données à nouveau. La seule façon de ne pas recevoir de nouveau il est de maintenir la même instance de cet auditeur.

En plus de maintenir mon exemple d'écoute, je l'ai aussi utilisé une autre solution. À mon avis, je ne suis pas friand. Mais est toujours ce que j'utilise le plus souvent. Ce que je fais, est

  • Je garderai un final List<String>, appelé ignoredList. Cette liste serait construite d'une Stringclé, ce qui serait la clé de l'objet que vous avez déjà dans votre adaptateur.

  • Puis, onPauseje vais ajouter ces données à mon ignoredListet nulle sur l' childEventauditeur.

  • Après le onResumerappel , je mets une nouvelle instance de l' childEventauditeur.

  • Sur le onAddedde l'écouteur d'événement je vérifie l'objet nouvellement ajouté sur ma liste. Si je l' ai, je vais l' enlever de la liste et rien d' autre. Essentiellement ignorant. Si l'objet est pas dans mon ignoredListje débrouille comme normale. Si je reçois d'un des appels autres que le dos onAdded, (c. -à- onRemoved onChangedou onMoved) je ferai ce changement d'événement à cet objet dans la liste et retirer ignoredList.

Maintenant, je l' avoue ce n'est pas vraiment la plus jolie solution. Vous pouvez voir des données incorrectes si deux sources modifiaient la même DataSnapshot. Ce serait une petite chance, mais tout à fait possible. Heureusement , si les ensembles de données devaient tomber inexactes, il ne sauvera pas à Firebase.

Je cherche toujours activement de meilleures stratégies pour cela, et si je trouve que je vais partager. En attendant, cette solution fonctionne parfaitement pour mes applications.

Créé 16/04/2015 à 20:29
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more