java - 活动关闭时停止方法重复
问题描述
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
。
解决方案
该方法将在每次收到新消息时触发,因为一直addValueEventListener
在您的参考处监听更改,您可以使用来修复它,addListenerForSingleValueEvent
但只会触发一次。
从文档
读取数据一次
在某些情况下,您可能希望调用一次回调然后立即删除,例如在初始化您不希望更改的 UI 元素时。您可以使用 addListenerForSingleValueEvent() 方法来简化此场景:它触发一次,然后不再触发。
推荐阅读
- docker - 将应用程序部署到 OpenShift 的多种选择
- angularjs - 如何使用 ui-grid 应用 pagination.js
- ios - Swift 4 Firebase Auth 自定义错误代码
- python - 添加或读取时处理数据
- bash - bash 脚本 - 如何使用作为变量调用的函数的结果
- ruby-on-rails - Active Record 添加普通 sql 索引失败,区分大小写
- c# - 如何捏合和缩放或平移 ARCore 摄像头。Unity3d
- c++ - 如何包装多级原始指针以赋予它容器语义
- filebeat - 使用 ELK 配置 filebeat
- python - 嗨,如何从流中捕获和解析字母