首页 > 解决方案 > 活动关闭时停止方法重复

问题描述

    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 正在看到 Bs 消息,但是一旦 A 退出聊天,B 发送的消息仍然被称为被看到A 即使 A 不在活动中。

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

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

标签: javaandroiddatabasefirebasefirebase-realtime-database

解决方案


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

从文档

读取数据一次

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


推荐阅读