web-dev-qa-db-fra.com

Savoir si childEventListener sur Firebase a terminé le chargement de toutes les données

J'utilise Firebase Realtime Database pour stocker et récupérer les données de mon Android application. Dans mon activité, je récupère toutes les données (exemple: liste des données utilisateur) de Firebase à l'aide d'un childEventListener.

Je souhaite afficher une barre de progression tant que les données ne sont pas complètement extraites de la base de données. Comment vérifier si toutes les données sont complètement récupérées afin de pouvoir fermer la barre de progression après le chargement des données?

42
Stanley Giovany

Il existe un moyen courant de détecter le moment où Firebase a terminé de synchroniser les données initiales sur un emplacement donné. Cette approche utilise l’une des garanties d’événements Firebase :

Les événements de valeur sont toujours déclenchés en dernier et il est garanti qu'ils contiendront les mises à jour de tout autre événement survenu avant la prise de cet instantané.

Donc, si vous avez à la fois ValueEventListener et ChildEventListener sur un emplacement donné, il est garanti que la ValueEventListener.onDataChange() sera appelée après tous les appels onChildAdded() ont eu lieu. Vous pouvez utiliser ceci pour savoir quand le chargement initial des données est terminé:

ref.addListenerForSingleValueEvent(new ValueEventListener() {
    public void onDataChange(DataSnapshot dataSnapshot) {
        System.out.println("We're done loading the initial "+dataSnapshot.getChildrenCount()+" items");
    }
    public void onCancelled(FirebaseError firebaseError) { }
});
ref.addChildEventListener(new ChildEventListener() {
    public void onChildAdded(DataSnapshot dataSnapshot, String previousKey) {
        System.out.println("Add "+dataSnapshot.getKey()+" to UI after "+previousKey);
    }
    public void onChildChanged(DataSnapshot dataSnapshot, String s) {
    }
    public void onChildRemoved(DataSnapshot dataSnapshot) {
    }
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {
    }
    public void onCancelled(FirebaseError firebaseError) { }
});

Dans mon test, cela se traduit par:

Add -K2WLjgH0es40OGWp6Ln to UI after null
Add -K2YyDkM4lUotI12OnOs to UI after -K2WLjgH0es40OGWp6Ln
Add -K2YyG4ScQMuRDoFogA9 to UI after -K2YyDkM4lUotI12OnOs
...
Add -K4BPqs_cdj5SwARoluP to UI after -K4A0zkyITWOrxI9-2On
Add -K4BaozoJDUsDP_X2sUu to UI after -K4BPqs_cdj5SwARoluP
Add -K4uCQDYR0k05Xqyj6jI to UI after -K4BaozoJDUsDP_X2sUu
We're done loading the initial 121 items

Vous pouvez donc utiliser l'événement onDataChanged() pour masquer la barre de progression.

Mais gardez à l’esprit que Firebase ne se contente pas de charger des données. Il synchronise en continu les données du serveur vers tous les clients connectés. En tant que tel, il n'y a pas vraiment de moment où les données sont complètement récupérées.

84
Frank van Puffelen

Je l'ai fait de manière assez simple. Je laisse un int compter, puis chaque fois que cela entre dans la fonction, je l'incrémente et je vérifie s'il est égal au nombre total d'enfants. si c'est égal alors là vous pouvez arrêter la barre de progression

    int count = 0;    
    ref.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            count++;


            if(count >= dataSnapshot.getChildrenCount()){
                //stop progress bar here
            }
        }
10
osama