【问题标题】:Firebase listeners still listening after activity being finished [duplicate]Firebase 监听器在活动完成后仍在监听 [重复]
【发布时间】:2020-07-11 03:55:52
【问题描述】:

我的部分代码中有一个 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”的新活动并完成所有底层活动(包括沙龙)。在游戏过程中,“gameState”多次更改,但是当设置为:“choose_letter”时,活动重新打开,在控制台中我可以阅读“开始游戏”。 总而言之,不知何故,即使活动“沙龙”关闭,在该活动中声明的数据库侦听器仍在工作。 我想知道,这怎么可能,我该怎么做修复它?

【问题讨论】:

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


    【解决方案1】:

    发生这种情况是因为数据库引用包含对其值事件侦听器的强引用。因此,即使您的活动被破坏,如果您不将其从 refState 对象中删除,您仍然可以通过值事件侦听器接收消息。

    【讨论】:

      【解决方案2】:

      在进入下一个 Activity 之前移除 value 事件监听器

      refState.removeEventListener(listenerName)
      

      试试这个代码

      onCreate 内部

      DatabaseReference refState = FirebaseDatabase.getInstance().
          getReference("/Rooms/"+roomName+"/gameState");
      refState.addValueEventListener(stateValueEventListner);
      

      onCreate 之外

      private ValueEventListener stateValueEventListner = new ValueEventListener() {
          @Override
          public void onDataChange(DataSnapshot dataSnapshot) {
                 try {
                      String gameState = dataSnapshot.getValue(String.class);
                      if (gameState.equals("choose_letter")) {
                          System.out.println("Starting game");
                          startGame();
                      }
                    }
                    catch(Exception e)
                    {}
                  }
      
                  @Override
                  public void onCancelled(DatabaseError databaseError) {
                      System.out.println("Error");
                  }
      
              }); 
      

      移除值事件监听器

      refState.removeEventListener(stateValueEventListner):
      

      【讨论】:

      • 太棒了!但是我仍然想知道为什么关闭活动并不会像其他东西一样自行删除侦听器
      • valueEventListner 附加到应用程序,只要数据库发生变化就会调用它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 2021-11-28
      • 2021-07-15
      相关资源
      最近更新 更多