removeEventListener无法在Firebase数据库上运行

时间:2017-07-24 22:26:48

标签: android firebase firebase-realtime-database event-listener

我在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);

似乎在继续倾听,有人能告诉我我做错了吗?

我知道我可以使用单个事件监听器,但我希望它能够在此活动中继续监控,但在其他活动中则不能。

谢谢!

2 个答案:

答案 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 !!