2015-06-22 5 views
8

Я хочу удалить слушателя addValueEventListener из refb firebase, когда значение определенного поля истинно.removeEventListener не удаляет прослушиватель в 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 
    } 
}); 

Но addValueEventListener не получает удалены, и это называется для этого firebase исх. Поэтому, пожалуйста, предложите мне, как удалить слушателя из любого refb firebase, если потребуется.

+0

Ваш 'valueListener' всегда' null' – talex

+1

Вы можете удалить слушателя внутри обратного вызова с 'если (название) {fb.removeEventListener (это); } '. Несвязанный: большинство читателей этого кода предполагают, что 'title' является строкой. Возможно, вы захотите использовать имя переменной, которое является более интуитивным, чтобы интерпретировать как логическое, например. 'IsFinished'. –

+1

valueListener имеет ссылку при добавлении слушателя @talex – Keshav

ответ

8

Вы можете удалить слушателя изнутри обратного вызова с:

ref.removeEventListener(this); 

Так полный фрагмент:

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

Я удалил HashMap, вместо того, чтобы, используя методы DataSnapshot для достижения той же , Я также переименовал несколько переменных, чтобы быть более ясным/более идиоматичным.

+2

Я пробовал, но слушатель не удаляется с использованием вышеуказанного кода @ Frank van Puffelen – Keshav

+0

Вы запустили в отладчике? Если это так, 'isFinished ever' true'? –

+1

Да, его истинный и регистратор внутри, если оператор выше ref.removeEventListener (this) получает выполнение – Keshav

2

Убедитесь, что вы добавили и удалили прослушиватель на том же узле в DatabaseReference. Например:

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

Ваш слушатель - это случай, указывающий на путь_2. Если вы пытаетесь удалить слушатель, используя этот код

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

это не будет работать, потому что вы пытаетесь удалить слушатель от неправильного узла. Правильный путь будет

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

не работает для меня, хотя Но я также нашел эту ошибку –

0

Я надеюсь, что это поможет ... только года могут использовать этот метод, это работа для меня ...

private DatabaseReference dbRef; 

Записи от OnCreate()

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

Записывайте OnDestroy()

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

    } 

Список Шенер

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


     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }; 

}