我在任何私有方法之外使用EventListener,以便稍后可以在onStart()
方法中调用它:
该侦听器的目的是,聊天应用程序将显示消息的接收者是否已查看该消息。我想我可能犯了一些错误。ListenerRegistration
的声明在onCreate()方法之前进行
ListenerRegistration listenerRegistration;
EventListener(在onCreate()方法内部)
EventListener<DocumentSnapshot> eventListener = new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot snapshot, @Nullable FirebaseFirestoreException e) {
if (snapshot != null){
String recipientId = getIntent().getStringExtra("recipientId");
Chat chat = snapshot.toObject(Chat.class);
if (chat.getReceiver().equals(userId) && chat.getSender().equals(recipientId)){
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("isseen", true);
FirebaseFirestore.getInstance().collection("chats").document(roomId).collection("messages").add(hashMap);
}
}
}
};
onStart()方法
@Override
protected void onStart() {
super.onStart();
listenerRegistration = FirebaseFirestore.getInstance().collection("chats").document(roomId).collection("messages").addSnapshotListener(MessageActivity.this,eventListener);
}
请看一下EventListener,让我知道是否应该将其更改为QuerySnapshot或QueryDocumentSnapshot,因为我使用的是DocumentSnapshot,并且它们警告我事件侦听器中的getReceiver方法将创建NullPointerException。
(还有一些可能有用或可能无效的额外信息:-每条消息都存储在“消息”集合内的随机生成的文档中)
最佳答案
您正在谈论的有关getReceiver()
的错误消息与所接收的快照类型无关。实际上,实际上您没有选择快照类型的权限-您必须使用API提供给您的快照类型来进行查询。
关于getReceiver()
的错误是因为chat
可以为null:
Chat chat = snapshot.toObject(Chat.class);
toObject()的API文档指出,如果获取的文档不存在,则它可以返回null。您需要检查这种情况,以便在尝试
get()
实际不存在的文档时,代码不会在运行时崩溃。Chat chat = snapshot.toObject(Chat.class);
if (chat != null) {
// you can call methods of chat safely here
}
else {
// determine what you want to do if the document doesn't exist
}
关于java - 我应该使用DocumentSnapshot,QuerySnapshot还是QueryDocumentSnapshot?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59686539/