我在Firebase数据库的根目录上设置了一个监听器 -
database = FirebaseDatabase.getInstance();
rootDB = database.getReference();
我有一个听众设置如下 -
groupListener = (new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.i("ValueEventListener", "Count :" + dataSnapshot.getChildrenCount());
.... more code...
我将听众附加如下 -
rootDB.addValueEventListener(groupListener);
然后当我加载一个新活动时,我想让它停止收听,所以我使用 -
rootDB.removeEventListener(groupListener);
似乎在继续倾听,有人能告诉我我做错了吗?
我知道我可以使用单个事件监听器,但我希望它能够在此活动中继续监控,但在其他活动中则不能。
谢谢!
答案 0 :(得分:6)
三个建议:
1。您可能会多次添加侦听器。
如果已将监听器多次添加到数据位置,则为 每个事件多次调用,您必须将其分离 完全删除它的次数。 (from here)
2。您要添加的侦听器可能与您正在删除的不一样。 这里CASE 1将删除监听器,而CASE 2则不会:
//CASE 1:
ValueEventListener listener = new ValueEventListener() {....}
databaseRef.addValueEventListener(listener);
databaseRef.removeEventListener(listener);
//CASE 2:
public ValueEventListener listener(){
return new ValueEventListener() {....}
}
databaseRef.addValueEventListener(listener());
databaseRef.removeEventListener(listener());
3。作为解决方法,您可以设置布尔值并在想要停止/开始收听时更改其值:
groupListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(isListening){
//...
}
}
希望其中一人有所帮助......
答案 1 :(得分:4)
这令人抓狂!
据我所知,removeEventListener
方法是异步的,最终将被删除。但是,如果您尝试快速从一个DatabaseReference
切换到另一个$uid
路径,那么您将进行重复调用。我没有找到解决此问题的同步方法。
经过几个小时的调试并且我的大部分时间都被我偷走了,我扩展了ChildEventListener
界面,添加了@Ahmed上面提到的isListening
功能。现在我看到,虽然最初有onChildAdded
的重复调用,但它们最终会消退。
GLWY !!