当前位置: 首页 > 知识库问答 >
问题:

活动结束后仍在收听的Firebase听众[副本]

翟单弓
2023-03-14

我在代码的一部分中有一个Firebase实时数据库监听器,它是:

DatabaseReference refState= FirebaseDatabase.getInstance().getReference("/Rooms/"+roomName+"/gameState");
refState.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    String gameState = dataSnapshot.getValue(String.class);
                    if (gameState.equals("choose_letter")) {
                        System.out.println("Starting game");
                        startGame();
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    System.out.println("Error");
                }

            }); 

其中startGame()函数为:

private void startGame(){
         Intent i = new Intent(Salon.this, Game.class);
         i.putExtra("username",username);
         i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
         startActivity(i);
          finish();      
    }

代码工作并执行我想要的操作:当datdabased中的“gamestate”值更改为“choose_letter”时,它从当前活动“salon”开始一个名为“game”的新活动,并完成所有底层活动(包括salon)。在游戏过程中,“gamestate”会改变几次,但是当设置为:“choose_letter”时,活动会重新打开,在控制台中我可以读到“开始游戏”。因此,总而言之,不知何故,即使关闭了活动“沙龙”,该活动中声明的数据库侦听器仍在工作。我想知道,这怎么可能,我该如何修复它?

共有1个答案

雷国兴
2023-03-14

发生这种情况是因为数据库引用持有对其值事件侦听器的强引用。因此,即使您的活动被销毁,如果您不从refstate对象中删除它,您仍然能够通过值事件侦听器接收消息。

 类似资料:
  • 在iOS中,当视图控制器消失时删除监听器是一个很好的做法。那么在Android世界也是这样吗?是否应该删除活动的中的所有侦听器

  • 监听器提供对JMeter在JMeter运行时收集有关测试用例的信息的访问。 听众收集的结果或信息可以以下列形式显示: tree tables graphs 日志文件 当指定一个侦听器时,所有侦听器都将相同的原始数据写入输出文件。 默认配置 要保存的默认项目可以通过以下两种方式之一定义 - 在jmeter.properties (或user.properties)文件中。 此文件存在于JMeter的

  • 我有两个屏幕..首先是闪屏,在这里我借助firebase.auth()检查用户是否已经存在。onAuthStateChanged侦听器。如果用户为空,它将转到另一个firebase.auth()的登录屏幕。onAuthStateChanged侦听器用于在电话验证后获取用户,如果用户之前未注册,则将用户移至UserDetails屏幕以获取更多用户信息,或者移至主屏幕..同样的检查也在闪屏上进行,以确

  • 我遇到了这个githttps://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md,它展示了开发人员如何通过添加“被动监听器”来提高滚动性能。我第一次看到它是在我的chrome向我显示警告时(确切的警告是“由于主线程繁忙,‘触摸启动’输入事件的处理延迟了126毫秒”。考虑将事件处理程序标记为“被动”,以使页面更具响应性。

  • 我是一个巨大的promise链,但我意识到其中一个函数返回一个对象,该对象具有侦听器,并对回调作出反应,如 我想知道是否有一种方法可以使用promise来实现这一点,并将其转化为可选项。除了重写我的整个promise链来使用回调,没有其他选择吗?

  • 我试图通过stackoverflow搜索这个问题,但找不到合理的答案。我对@Kafkalistener注释的方法的签名很好奇,我们需要遵循什么约定吗?。如果我们想通过方法注入传入spring管理的bean呢?我试图通过方法注入将服务类传递给kafka侦听器- 我得到以下例外- 如果我使相关服务类自动生成,工作正常。