android firebase stop ChildEventListener

时间:2017-11-03 23:07:03

标签: java android firebase firebase-realtime-database observers

当我离开活动时,我试图删除我的ChildEventListener观察者,如下面的onPause方法所示。基本上我的问题是当我离开活动并返回它时,我的childListener增加1,这取决于我离开活动多少次并返回它,我的System.out.println将打印到控制台" onChildAdded&#34 ;和" onChildRemoved"多次,我只希望它被调用一次。当我离开活动时如何终止我的听众的任何帮助,谢谢你提前:)

// Connect to DB
private DatabaseReference mDataBase;
private FirebaseAuth mAuth = FirebaseAuth.getInstance();
String currentUser_UID = mAuth.getCurrentUser().getUid();
ChildEventListener childListener;

@Override
    protected void onCreate(Bundle savedInstanceState) {

    mDataBase = FirebaseDatabase.getInstance().getReference();
    childListener = mDataBase.child("Users").addChildEventListener(new ChildEventListener() {

        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            String savedCardUser = (String) dataSnapshot.child("Card").getValue();
            System.out.println("onChildAdded");
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            System.out.println("onChildRemoved");
        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

    @Override
    protected void onPause() {
        super.onPause();

        mDataBase.removeEventListener(childListener);
     }

修改

如果它不是最简单的东西:)必须添加child()路径现在完美。成功删除我的听众

mDataBase.child("Card").removeEventListener(childListener);

1 个答案:

答案 0 :(得分:0)

如果在您的情况下不需要添加子事件侦听器,那么您好。你可以使用一个简单的单个事件监听器,它只会触发一次,所以一旦它被触发它就不会再次触发

所以这样做

在你的情况下,

on create method将是最好的选择:

//in on create method do that 

 //this is your database reference
 mDataBase = FirebaseDatabase.getInstance().getReference();

 //add single event listener like that

 mDataBase.addListenerForSingleValueEvent(new ValueEventListener(){

 //in data change method you do the rest of your code
  @Override
  public void onDataChange(DataSnapshot dataSnapshot){

    String savedCardUser = (String) dataSnapshot.child("Card").getValue();
    System.out.println("onChildAdded");

  } 

  //on canceled.......

 });

这只会触发一次(当您的活动创建时),并且您不必担心会移除听众。

编辑

好的,如果子事件侦听器在您返回到您的活动时触发,则意味着您在(onResume)或(onStart)中附加了侦听器。如果这就是你所做的那么这就是问题所在,因为在你返回到它们的活动中,onstart会在恢复时开始等等......但是(onCreate)不会因此附加子事件监听器( onCreate)你不再有问题了。

这样做:

 //in on create 

  mDataBase = FirebaseDatabase.getInstance().getReference();
  childListener = mDataBase.child("Users").addChildEventListener(new ChildEventListener() {

@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
    String savedCardUser = (String) dataSnapshot.child("Card").getValue();
    System.out.println("onChildAdded");
}

//and in pause keep the same code (remove the child listener)

编辑2

好的,我在调用super后删除了监听器的问题,所以在暂停时执行此操作

 @Override
protected void onPause() {
    //this should be before super 
    mDataBase.removeEventListener(childListener);
    super.onPause();


 }