当活动关闭时,阻止方法重复

时间:2018-11-06 15:39:17

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

    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,则通知B已看到消息,并且当用户A处于聊天B时,B仍连续收到有关A正在查看Bs消息的通知,但是一旦A退出聊天,消息B发送仍然被称为如A所见,即使A不在活动中。

仅当A关闭应用程序(甚至从后台关闭)时,B才停止将其消息发送给A,如A所见。

我确定问题是由于此方法引起的,所以我只想知道如何在活动关闭后使该方法停止执行。此方法位于ChatActivity的onCreate中。

1 个答案:

答案 0 :(得分:1)

由于addValueEventListener一直在监听您的引用以进行更改,因此该方法将在每次收到新消息时触发,要解决此问题,您可以使用addListenerForSingleValueEvent,但只会触发一次。

来自文档

一次读取数据

  

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