删除事件接收器未删除 firebase 中的侦听器

我想从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 ref 。因此,如果需要,请建议我如何从任何firebase ref中删除监听器。


答案 1

您可以使用以下命令从回调中删除侦听器:

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

我删除了 ,而是使用 的方法来完成相同的操作。我还重命名了一些变量,使其更清晰/更惯用。HashMapDataSnapshot


答案 2

确保将侦听器添加和删除到数据库引用上的同一节点。例如:

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

推荐