特定のフィールドの値がtrueの場合、fireValue 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.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);
}
}