如何防止SnapshotListener在初始化时被触发

时间:2019-03-31 21:00:55

标签: android firebase google-cloud-firestore

我想制作一个聊天应用程序,在其中可以加载聊天的所有消息。它们已经在我的Firestore中,但是当我初始化代码时,我的消息集合的SnapshotListener会在初始化后立即触发,告诉我已添加到Firestore中的所有项目。我想拥有所有这些物品,但问题是它们都是随机排列的。因此,我的目标是在初始化时填充消息,然后仅在将新消息添加到Firestore时由侦听器通知。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
   //... more code here
   messagesCollectionReference.addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@javax.annotation.Nullable QuerySnapshot queryDocumentSnapshots, @javax.annotation.Nullable FirebaseFirestoreException e) {
                if (e != null) {
                    System.out.println("Error:" + e);
                    return;
                }

                for (DocumentChange dc : queryDocumentSnapshots.getDocumentChanges()) {
                    ChatMessage myChatMessage = dc.getDocument().toObject(ChatMessage.class);
                    mMessageAdapter.add(myChatMessage);
                }
            }
        });
    //... more code here
}

这是我的代码当前的样子,并以随机顺序加载所有消息,我想要的就是这样。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
   //... more code here

    messagesCollectionReference.orderBy("timestamp").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (QueryDocumentSnapshot document : task.getResult()) {
                        ChatMessage myChatMessage = document.toObject(ChatMessage.class);
                        mMessageAdapter.add(myChatMessage);
                    }
                } else {
                    System.out.println("Error: " + task.getException());
                }

            }
        });

   messagesCollectionReference.addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@javax.annotation.Nullable QuerySnapshot queryDocumentSnapshots, @javax.annotation.Nullable FirebaseFirestoreException e) {
                if (e != null) {
                    System.out.println("Error:" + e);
                    return;
                }

                for (DocumentChange dc : queryDocumentSnapshots.getDocumentChanges()) {
                    ChatMessage myChatMessage = dc.getDocument().toObject(ChatMessage.class);
                    mMessageAdapter.add(myChatMessage);
                }
            }
        });
    //... more code here
}

但是,如果现在执行此操作,则我将首先按错误的顺序显示消息,然后按正确的顺序显示消息。因此,我需要一种方法来防止快照侦听器在初始化时已被释放到Firestire中的数据触发。

0 个答案:

没有答案