Firebase говорит, что если вы добавите addSnapshotListener, то должны удалить его один раз, в этом нет необходимости Отсоединять прослушиватель
Когда вы больше не заинтересованы в прослушивании ваших данных, вы должны отключить прослушиватель, чтобы перестали вызываться обратные вызовы событий. Это позволяет клиенту прекратить использовать пропускную способность для получения обновлений. Вы можете использовать функцию отмены подписки на onSnapshot(), чтобы прекратить прослушивание обновлений.
Переведено автоматически
Ответ 1
Для достижения этого вам нужно использовать EventListener<DocumentSnapshot> вот так:
EventListener<DocumentSnapshot> eventListener = newEventListener<DocumentSnapshot>() { @Override publicvoidonEvent(DocumentSnapshot snapshot, FirebaseFirestoreException e) { if (snapshot != null && snapshot.exists()) { //Do what you need to do } } };
Объявите глобальную ListenerRegistration listenerRegistration; переменную и добавьте SnapshotListener в том месте, где это необходимо, вот так:
if (listenerRegistration == null ) { listenerRegistration = yourRef.addSnapshotListener(eventListener); }
Чтобы удалить прослушиватель, просто используйте следующие строки кода в вашем onStop() методе:
Когда вы вызываете addSnapshotListener для прослушивания обновлений в реальном времени, это означает, что вы подключаете прослушиватель, который вызывается при каждом изменении, происходящем в вашей базе данных. Итак, это происходит и при закрытии вашего приложения, поэтому обязательно отсоедините прослушиватели, прежде чем действие будет уничтожено.
Если в вашем приложении вам не нужно получать данные в реальном времени, то вы можете просто использовать get() вызов непосредственно по ссылке, который просто считывает документ только один раз. Поскольку он считывается только один раз, нет прослушивателя, который нужно удалять. Это соответствует addListenerForSingleValueEvent() используется в базе данных Firebase realtime.
Существует также более элегантный способ удаления прослушивателя, который заключается в передаче действия в качестве первого аргумента в методе addSnapshotListener(), поэтому Firestore может автоматически очищать прослушиватели при остановке действия.
Существует также более элегантный способ удаления прослушивателя, который заключается в передаче действия в качестве первого аргумента в методе addSnapshotListener() , чтобы Firestore мог автоматически очищать прослушиватели при остановке действия. Цитата из блока
Это было очень важно. Я не искал "элегантный способ", но это была подсказка, почему мой прослушиватель иногда останавливается. Я удалил поле активности, и теперь прослушиватель не останавливается без моего прямого указания в случае изменения состояния активности.