Java android firebase停止ChildEventListener

Java android firebase停止ChildEventListener,java,android,firebase,firebase-realtime-database,observers,Java,Android,Firebase,Firebase Realtime Database,Observers,当我离开活动时,我正试图删除我的ChildEventListener观察者,如onPause方法中所示。基本上,我的问题是当我离开活动并返回到它时,我的childListener会增加1,因此取决于我离开活动并返回到它的次数,System.out.println会多次打印到控制台“OnChildeded”和“onChildRemoved”,我只希望调用一次。关于如何在我离开活动时终止听众的任何帮助,请提前感谢:) 编辑 如果这不是最简单的事情:)现在必须添加child()路径才能完美工作。成功删

当我离开活动时,我正试图删除我的ChildEventListener观察者,如onPause方法中所示。基本上,我的问题是当我离开活动并返回到它时,我的childListener会增加1,因此取决于我离开活动并返回到它的次数,System.out.println会多次打印到控制台“OnChildeded”和“onChildRemoved”,我只希望调用一次。关于如何在我离开活动时终止听众的任何帮助,请提前感谢:)

编辑

如果这不是最简单的事情:)现在必须添加child()路径才能完美工作。成功删除我的侦听器

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

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

那就这么做吧

在您的情况下,on create方法是执行此操作的最佳位置:

//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将启动,然后是resume等等……但是(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();


 }

你的问题不是阻止任何事情。这是关于阻止它从以前的实例恢复。。。为什么需要这个?因为当触发onChildRemoved时,我正在从数组列表中删除一个元素,并且由于它被多次调用,它从数组列表中删除了多个项目,然后崩溃,因为它要删除的索引不存在:)问题中没有Arraylist。请显示实际问题的一部分显示与我的主要问题无关,我的主要问题是如何删除ChildEventListener观察员:)我的数组列表问题仅从该问题开始您的侦听器设置在所有用户上。多个用户是否可以拥有同一个卡实例?谢谢您的建议,但我还想监听ChildAdded,以便在用户收到消息时发出警报:)因此,您的问题是,当您返回时,侦听器会再次触发,或者当您重新创建活动时,当我离开活动时,然后返回该活动:(我发现了其他建议,建议在活动暂停时使用removeEventListener,但在我的情况下,它并不是删除Observer,而是完全忘记在我上面的代码中添加该部分。对此,我感到抱歉。但是,是的,我的(onCreate)中已经有了它,并且它仍被多次触发:)
 @Override
protected void onPause() {
    //this should be before super 
    mDataBase.removeEventListener(childListener);
    super.onPause();


 }