android firebase stop ChildEventListener
我想在我的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);
您好,如果您的情况下不需要添加子事件侦听器。你可以只使用一个简单的单个事件侦听器将触发一次,所以一旦被触发,将不会再次触发
这样做
上创建的方法是做的最好的地方你案例:
//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();
}
谢谢你的建议,但我也想听ChildAdded,所以我可以提醒当用户得到消息:) –
所以你的问题是,当你回到监听器再次触发,或当你重新创建活动 –
当我离开活动,然后返回到它:( –
你的问题的问题不是要阻止任何事情。这是为了防止它从以前的实例恢复...为什么你需要这个? –
因为当onChildRemoved被触发时,我正在从我的数组列表中删除一个元素,并且因为它被多次调用,所以它从我的数组列表中删除多于1个项目,然后崩溃,因为它正在寻找删除的索引不存在:) –
问题中没有Arraylist。请显示实际问题的[mcve] –