Я создаю модуль чата, используя базу данных Firestore. Ниже приведен мой код прослушивателя, который прослушивает новые сообщения в:
mDb.collection("Users_Collection").document(mAuth.getUid()).collection("Recipients")
.document(psychichObj.getUid()).collection("Messages").orderBy("time").limit(30)
.addSnapshotListener(MetadataChanges.INCLUDE, new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
if (e==null){
for (DocumentChange dc:queryDocumentSnapshots.getDocumentChanges()){
switch (dc.getType()){
case ADDED:
Log.d("chatevents", "onEvent:Added ");
messgaesDataClass msg = dc.getDocument().toObject(messgaesDataClass.class);
messages.add(msg);
chatAdapter.notifyDataSetChanged();
messagesRecycler.smoothScrollToPosition(messages.size());
break;
case REMOVED:
Log.d("chatevents", "onEvent:Removed ");
case MODIFIED:
Log.d("chatevents", "onEvent:Modiefied ");
}
}
}
}
});
Когда я отправляю сообщение, я хочу знать, как я могу прослушивать объект msg, который находится в локальном кеше или чьи метаданные находятся в состоянии ожидания и еще не отправлены на сервер?




При передаче Изменения метаданных методу addSnapshotListener (MetadataChanges metadataChanges, прослушиватель EventListener) запроса:
Indicates whether metadata-only changes (i.e. only Query.getMetadata() changed) should trigger snapshot events.
Что в основном означает, что каждый раз, когда метаданные изменяются, слушатель запускается. Таким образом, в случае незавершенных операций значение переменной pending будет изменено.
I want to know how can i listen for a msg object that is in local cache
В этом случае вам следует рассмотреть возможность использования метода isFromCache() SnapshotMetadata:
Log.d(TAG, "isFromCache: " + documentSnapshot.getMetadata().isFromCache());
Когда я в сети, он печатает:
isFromCache: false
Когда я не в сети, он печатает:
isFromCache: true
Нет, onEvent:Added будет распечатан один раз для каждого элемента, соответствующего вашему запросу, и второй раз для каждого нового элемента, добавленного в этом конкретном месте с MetadataChanges, который соответствует в этот конкретный момент. Если вы хотите знать, когда данные фиксируются на серверах Firebase, вам нужно использовать CompleteListener.
Если есть потеря сетевого подключения (нет сетевого подключения на пользовательском устройстве), ни onSuccess(), ни onComplete() не запускаются. Такое поведение имеет смысл, поскольку задача считается выполненной только тогда, когда данные были зафиксированы (или отклонены) на серверах Firebase. Теперь нормально?
Итак, когда я отправляю сообщение, и оно еще не отправлено на сервер, чем документ слушателей. Добавленный случай будет выполняться в моем операторе переключения с ожидающим тегом, верно? поэтому, когда я в сети и его отправляют на сервер, будет запускаться дело document.Added снова или дело document.Modified будет запускаться?