【问题标题】:Stop a method from repeating when activity is closed活动关闭时停止方法重复
【发布时间】:2018-11-06 15:39:16
【问题描述】:
    final DatabaseReference db = FirebaseDatabase.getInstance().getReference();
    Query mSeenRef = db.child("Messages").child(MessageSenderId).child(MessageRecieverId).orderByChild("From").equalTo(MessageRecieverId);
    mSeenRef.addValueEventListener(new ValueEventListener(){
        @Override
        public void onDataChange(DataSnapshot dataSnapshot){
            if(dataSnapshot.exists()) {
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    String keyId = ds.getKey();
                    DatabaseReference mSendersRef = db.child("Messages").child(MessageSenderId).child(MessageRecieverId).child(keyId);
                    DatabaseReference mRecieversRef = db.child("Messages").child(MessageRecieverId).child(MessageSenderId).child(keyId);
                    Map<String, Object> childUpdates = new HashMap<>();
                    childUpdates.put("Seen", true);
                    mSendersRef.updateChildren(childUpdates);
                    mRecieversRef.updateChildren(childUpdates);

                }
            }
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });

此代码仅用于在基本聊天应用程序上设置SEEN=true,当您打开活动时它可以正常工作。

如果用户 A 打开聊天活动 B 会收到消息被看到的通知,并且当用户 A 在聊天中时 B 仍然会不断收到通知 A 正在查看 B 的消息,但是一旦 A 退出聊天,B 发送的消息仍然被称为即使 A 不在活动中,也如 A 所见。

只有当 A 关闭应用程序(即使是从后台关闭)时,B 才会停止向 A 发送消息。

我确定问题出在这个方法上,所以我只想知道如何让这个方法在活动关闭后停止执行。这个方法在ChatActivity的onCreate中。

【问题讨论】:

  • 该方法将在每次收到新消息时触发,因为 addValueEventListener 一直在您的参考处监听新值,要修复它,您可以使用 addListenerForSingleValue 但这只会触发一次
  • 非常感谢@GastónSaillén
  • 将其添加到答案中,以便其他人也可以找到有用的答案

标签: java android database firebase firebase-realtime-database


【解决方案1】:

该方法将在每次收到新消息时触发,因为addValueEventListener 一直在您的参考处侦听更改,要修复它,您可以使用addListenerForSingleValueEvent 但这只会触发一次。

来自文档

一次读取数据

在某些情况下,您可能希望调用一次回调,然后 立即删除,例如在初始化您设置的 UI 元素时 不要指望改变。您可以使用 addListenerForSingleValueEvent() 方法来简化这个场景:它 触发一次,然后不再触发。

【讨论】:

  • 没错,但您也可以根据活动的生命周期删除侦听器,正如我在此 post 的回答中所解释的那样。投票赞成。
  • 感谢亚历克斯的提示!投票赞成:)
猜你喜欢
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
相关资源
最近更新 更多