当我离开活动时,我试图删除我的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);
答案 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();
}