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中。
答案 0 :(得分:1)
由于addValueEventListener
一直在监听您的引用以进行更改,因此该方法将在每次收到新消息时触发,要解决此问题,您可以使用addListenerForSingleValueEvent
,但只会触发一次。
来自文档
在某些情况下,您可能希望一次调用一次回调 立即删除,例如初始化您的UI元素时 不要指望改变。您可以使用 addListenerForSingleValueEvent()方法可简化此方案: 触发一次,然后不再触发。