2015-06-22 19 views
8

Voglio rimuovere listener addValueEventListener da un ref di firebase quando il valore del campo particolare è true.removeEventListener non rimuove il listener in firebase

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 
    } 
}); 

Ma addValueEventListener non è sempre rimosso e si chiama per questo ref Firebase. Quindi, per favore suggeriscimi come rimuovere l'ascoltatore da qualsiasi ref firebase se necessario.

+0

vostro 'valueListener' è sempre' null' – talex

+1

è possibile rimuovere l'ascoltatore all'interno del callback con 'se (titolo) {fb.removeEventListener (questo); } '. Non correlato: la maggior parte dei lettori di questo codice assumerà che 'title' è una stringa. Potresti voler usare un nome di variabile che sia un po 'più intuitivo da interpretare come booleano, ad es. 'IsFinished'. –

+1

valueListener ha un riferimento quando viene aggiunto listener @talex – Keshav

risposta

8

È possibile rimuovere l'ascoltatore all'interno del callback con:

ref.removeEventListener(this); 

Così un frammento completo:

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 
    } 
}); 

ho rimosso il HashMap, invece di usare i metodi della DataSnapshot per ottenere lo stesso . Ho anche ribattezzato alcune variabili per essere più chiaro/più idiomatico.

+2

ho provato ma il listener non viene rimosso usando il codice precedente @ Frank van Puffelen – Keshav

+0

Hai eseguito un debugger? Se è così, è 'isFinished ever' true'? –

+1

Sì è vero e logger dentro se l'istruzione sopra ref.removeEventListener (this) viene eseguita – Keshav

2

Assicurarsi di aggiungere e rimuovere il listener sullo stesso nodo su DatabaseReference. Ad esempio:

//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); 
} 

Il listener in questo caso punta a path_2. Se si tenta di rimuovere il vostro ascoltatore utilizzando questo codice

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

non funzionerà perché si sta tentando di rimuovere l'ascoltatore dal nodo sbagliato. Il modo corretto sarebbe

mDatabaseReference.child(path_1).child(path_2).removeEventListener(myListener); 
+0

non funziona per me anche se Ma ho trovato anche questo errore –

0

Spero che questo vi aiuterà a ... basta yo può utilizzare questo metodo, è un lavoro per me ...

private DatabaseReference dbRef; 

Write da onCreate()

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

Write da OnDestroy()

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

    } 

Lista ener

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


     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }; 

}

Problemi correlati