17 votes

onDataChange est appelé deux fois dans Android Firebase

Voici ma requête simple pour les données firebase en utilisant l'horodatage dans l'application Android

Query recentStaticJobQuery = reference.child(AppConstants.WORKINDIA_JOBS)
                        .child(AppConstants.WORKINDIA_STATIC_JOBS)
                        .orderByChild(AppConstants.TIMESTAMP)
                        .startAt(lastStaticJobSyncTime); 
recentStaticJobQuery.addListenerForSingleValueEvent
(staticJobDownloadListener);

 ValueEventListener staticJobDownloadListener = new ValueEventListener() {
    @Override
    public void onDataChange(final DataSnapshot dataSnapshot) {
        Log.i("Firebase", "Called")
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.i("Firebase", "onCancelled")
    }
};

Comment éviter que onDataChange soit appelé deux fois dans Android Firebase ?

9voto

Ajitesh Shukla Points 1

Il y a deux cas de figure où cela peut se produire :

  1. onDataChange est appelé deux fois si vous avez activé la persistance hors ligne. Une fois avec la valeur hors ligne périmée et une autre fois avec la valeur mise à jour au cas où elle aurait changé.

  2. onDataChange est appelé plusieurs fois au cas où vous n'auriez pas supprimé l'écouteur correctement et que vous créeriez une nouvelle instance de votre écouteur dans votre activité à chaque fois que vous l'ouvrez.

Le scénario 2 est facile à résoudre. Vous pouvez maintenir des références locales de votre référence firebase et de votre listener, puis vous pouvez faire un ref.removeListener(listener) en onDestroy de votre activité. Le scénario 2 est difficile à résoudre et vous avez deux solutions possibles :

  1. Désactivez la persistance hors ligne si vous souhaitez toujours disposer de la dernière valeur mise à jour.
  2. Faire un runnable.postDelayed(callbackRunnable, 3000); pour attendre la dernière valeur pendant 3 secondes avant de mettre à jour les vues ou ce que vous voulez mettre à jour.

3voto

Utiliser SingleEventListener au lieu de ValueEventListener Comme ceci

Firebase ref = new Firebase("YOUR-URL-HERE/PATH/TO/YOUR/STUFF");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
   @Override
   public void onDataChange(DataSnapshot dataSnapshot) {
       String value = (String) dataSnapshot.getValue();
       // do your stuff here with value
   }
   @Override
   public void onCancelled(FirebaseError firebaseError) {
   }
});

0voto

Remplacez votre requête en ajoutant endAt() comme ci-dessous. Cela vous aidera.

Query recentStaticJobQuery = reference.child(AppConstants.WORKINDIA_JOBS)
                        .child(AppConstants.WORKINDIA_STATIC_JOBS)
                        .orderByChild(AppConstants.TIMESTAMP)
                        .startAt(lastStaticJobSyncTime).endAt(lastStaticJobSyncTime+"\uf8ff");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X