removeEventListener无法在Firebase数据库上运行

And*_*r15 4 android event-listener firebase firebase-realtime-database

我在Firebase数据库的根目录上设置了一个监听器 -

database = FirebaseDatabase.getInstance();
rootDB = database.getReference();
Run Code Online (Sandbox Code Playgroud)

我有一个听众设置如下 -

groupListener = (new ValueEventListener() {

@Override
public void onDataChange(DataSnapshot dataSnapshot) {

Log.i("ValueEventListener", "Count :" + dataSnapshot.getChildrenCount());
.... more code...
Run Code Online (Sandbox Code Playgroud)

我附上听众如下 -

rootDB.addValueEventListener(groupListener);
Run Code Online (Sandbox Code Playgroud)

然后当我加载一个新的活动时,我想让它停止听,所以我使用 -

rootDB.removeEventListener(groupListener);
Run Code Online (Sandbox Code Playgroud)

它似乎在继续倾听,谁能告诉我我做错了什么?

我知道我可以使用单个事件监听器,但我希望它在此活动中保持监控,但在其他活动中则不行.

谢谢!

小智 6

三点建议:

1.您可能不止一次添加监听器.

如果已将侦听器多次添加到数据位置,则会为每个事件多次调用该侦听器,并且必须将其分离相同的次数才能完全删除它.(从这里)

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());
Run Code Online (Sandbox Code Playgroud)

3.作为一种解决方法,您可以设置布尔值并在想要停止/开始侦听时更改其值:

groupListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if(isListening){
            //...
        }
    }
Run Code Online (Sandbox Code Playgroud)

希望他们中的一个有帮助..