web-dev-qa-db-fra.com

removeEventListener ne supprime pas l'auditeur dans Firebase

Je veux supprimer l'écouteur addValueEventListener d'une référence firebase lorsque la valeur d'un champ particulier est true.

ValueEventListener valueListener=null;

private void removeListener(Firebase fb){
    if(valueListener!=null){
        **fb.removeEventListener(valueListener);**
    }
}

String key="https://boiling-heat-3083.firebaseio.com/baseNodeAttempt/" + userId+"/"+nodeType+"/"+nodeId+"/data";
final Firebase fb = new Firebase(key);
valueListener=fb.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snap) {
        final HashMap<String, Object> data=(HashMap<String, Object>) snap.getValue();
        if( data.get("attemptFinish_"+nodeId)!=null){
            boolean title = (boolean) snap.child("attemptFinish_"+nodeId).getValue();
            if(title){
                removeListener(fb);
            }
        }
    }
    @Override
    public void onCancelled() {
        // TODO Auto-generated method stub
    }
});

Mais addValueEventListener n'est pas supprimé et il est appelé pour cette référence firebase. Alors, s'il vous plaît, suggérez-moi comment supprimer l'auditeur de toute référence firebase, si nécessaire.

9
Keshav

Vous pouvez supprimer l'auditeur depuis le rappel avec:

ref.removeEventListener(this);

Donc, un fragment complet:

String key="https://boiling-heat-3083.firebaseio.com/baseNodeAttempt/" + userId+"/"+nodeType+"/"+nodeId+"/data";
final Firebase ref = new Firebase(key);
ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snap) {
        if (snap.hasChild("attemptFinish_"+nodeId) {
            boolean isFinished = (boolean) snap.child("attemptFinish_"+nodeId).getValue();
            if(isFinished){
                ref.removeEventListener(this);
            }
        }
    }
    @Override
    public void onCancelled() {
        // TODO Auto-generated method stub
    }
});

J'ai supprimé la HashMap, en utilisant plutôt les méthodes de la DataSnapshot pour accomplir la même chose. J'ai également renommé quelques variables pour qu'elles soient plus claires/plus idiomatiques.

12
Frank van Puffelen

Assurez-vous que vous ajoutez et supprimez le programme d'écoute sur le même nœud sur votre base de données. Par exemple:

//when declared like this, mDatabaseReference will point to the parent node by default
private DatabaseReference mDatabaseReference = FirebaseDatabase.getInstance().getReference();;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

//listener added to child node "path_2"
mDatabaseReference.child(path_1).child(path_2).addChildEventListener(myListener); 
}

Votre auditeur est ce cas pointe vers chemin_2. Si vous essayez de supprimer votre écouteur en utilisant ce code

//mDatabaseReference pointing to parent node (default behaviour)
mDatabaseReference.removeEventListener(myListener);

cela ne fonctionnera pas car vous essayez de supprimer le programme d'écoute du mauvais nœud. La bonne façon serait

mDatabaseReference.child(path_1).child(path_2).removeEventListener(myListener);
6
Andre Haueisen

J'espère que cela vous aidera ... juste vous pouvez utiliser cette méthode, c'est un travail pour moi ...

private DatabaseReference dbRef;

Écrire à partir de onCreate ()

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    dbRef= database.getReference("YOUR_PATH").child("KEY_NAME");
    InitListener();
    dbRef.addValueEventListener(valueEventListener); // ADDIND_LISTENER

Écrire à partir de onDestroy () 

if (dbRef!=null){
        dbRef.removeEventListener(valueEventListener);
        valueEventListener=null;
        dbRef=null;

    }

Auditeur 

 private void InitListener(String templeId) {
    valueEventListener=new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {


        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    };

}

1
Mathan Chinna
private DatabaseReference dbRef;
ValueEventListener mSendEventListner;

dbRef = FirebaseDatabase.getInstance().getReference().child("users").child(phone);

ValueEventListener valueEventListener = new ValueEventListener() 
{
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists())
                {              
                   //
                } 
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                //
            }
};
dbRef.addValueEventListener(valueEventListener);
mSendEventListner = valueEventListener;


//REMOVE VALUE EVENTLISTNER...
@Override
protected void onDestroy() 
{
    super.onDestroy();
    if (mSendEventListner != null) {
        dbRef.removeEventListener(mSendEventListner);
    }
}
0
Coldfin Lab