[Java] removeEventListener不會刪除Firebase中的偵聽器


Answers

確保您將偵聽器添加到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);
Question

當特定字段的值為true時,我想從firebase ref中移除addValueEventListener偵聽器。

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中移除監聽器。