3 回答
TA贡献1895条经验 获得超7个赞
当您在 Cloud Firestore 中侦听实时更改时,使用 Firestore Query 的addSnapshotListener()方法,它:
开始侦听此查询。
这基本上意味着第一次附加侦听器时,您将获得与该特定查询相对应的所有文档。此外,每次文档中的属性发生更改时,您都会根据该更改收到通知。显然,只有在侦听器保持活动状态且未被移除时才会发生这种情况。
不幸的是,Firestore 侦听器不能那样工作,因此您不能跳过“case ADDED”。相反,您可以做的是在每个用户对象下添加一个Date属性(这是您添加它的方式)并根据此新属性在客户端查询您的数据库,以查找自上次以来已更改的所有文档。
根据 Nick Cardoso 的评论,对于未来的访问者来说,可能会问为什么会发生这种行为,是因为他在评论中提到的原因。我还建议从这篇文章中查看 Doug Stevenson 的回答,以便更好地理解。
TA贡献2021条经验 获得超8个赞
有一个选项可以检查 querySnapshot 是否来自缓存,更改返回 false
if(querySnapshot.getMetadata().isFromCache()) return
TA贡献1803条经验 获得超6个赞
这是一个对我有用的解决方案:使用
AtomicBoolean isFirstListener = new AtomicBoolean(true);
然后在事件方法上
if (isFirstListener.get()) {
isFirstListener.set(false);
//TODO Handle the entire list.
return;
}
这是我的项目中的示例代码:
final AtomicBoolean isFirstListener = new AtomicBoolean(true);
mDb.collection("conversation_log").document(room_id).collection("messages").orderBy("sent_at")
.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot value2, @Nullable FirebaseFirestoreException e) {
if (isFirstListener.get()) {
isFirstListener.set(false);
//TODO Handle the entire list.
return;
}
}
});
添加回答
举报
