2015-06-22 60 views
8

當特定字段的值爲true時,我想從firebase ref中刪除addValueEventListener偵聽器。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參考。因此,如果需要,請告訴我如何從任何firebase ref中移除偵聽器。

+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

您是否在調試器中運行?如果是這樣,是否'結束'真'? –

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

您的監聽器是這種情況是指向path_2。 如果您嘗試使用此代碼

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

它不會工作,因爲你正試圖從錯誤的節點刪除偵聽刪除您的收聽。正確的方法是

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

不適合我雖然 但我也發現這個錯誤 –

0

我希望這將幫助你......只是喲可以使用此方法,這對我的工作......從的onCreate(

private DatabaseReference dbRef; 

寫)

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

寫()

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

    } 

名單ENER

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


     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }; 

}