removeEventListener不删除firebase中的侦听器

我想在特定字段的值为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 data=(HashMap) 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中删除监听器。

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

 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的方法来完成相同的操作。 我还将一些变量重命名为更清晰/更惯用。

确保在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); 

我希望这会对你有帮助……只是你可以使用这种方法,它对我有用…

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

}

 private DatabaseReference dbRef; ValueEventListener mSendEventListner; dbRef = FirebaseDatabase.getInstance().getReference().child("users").child(phone); ValueEventListener valueEventListener = new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { if (dataSnapshot.exists()) { // } } @Override public void onCancelled(@NonNull DatabaseError databaseError) { // } }; dbRef.addValueEventListener(valueEventListener); mSendEventListner = valueEventListener; //REMOVE VALUE EVENTLISTNER... @Override protected void onDestroy() { super.onDestroy(); if (mSendEventListner != null) { dbRef.removeEventListener(mSendEventListner); } }