我在任何私有方法之外使用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/

10-11 00:17