2017-11-03 94 views
-5

我想在我的onPause方法中如下所示离开活动时删除我的ChildEventListener观察者。基本上我的问题是,当我离开活动并返回到它时,我的childListener得到一个增量,这取决于我离开活动并返回它的次数,我的System.out.println将打印到控制台“onChildAdded”和“onChildRemoved”多次,我只希望它被调用一次。如何当我离开活动结束我的听众任何帮助,谢谢提前:)android firebase stop ChildEventListener

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

编辑

如果它不是简单的事情:)不得不添加子( )路径现在工作完美。成功删除我的听众

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

你的问题的问题不是要阻止任何事情。这是为了防止它从以前的实例恢复...为什么你需要这个? –

+0

因为当onChildRemoved被触发时,我正在从我的数组列表中删除一个元素,并且因为它被多次调用,所以它从我的数组列表中删除多于1个项目,然后崩溃,因为它正在寻找删除的索引不存在:) –

+0

问题中没有Arraylist。请显示实际问题的[mcve] –

回答

0

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

这样做

上创建的方法是做的最好的地方你案例:

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

EDIT 2

好吧,我给你删除侦听超级调用后这样做在暂停

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


} 
+0

谢谢你的建议,但我也想听ChildAdded,所以我可以提醒当用户得到消息:) –

+0

所以你的问题是,当你回到监听器再次触发,或当你重新创建活动 –

+0

当我离开活动,然后返回到它:( –

相关问题