Android

How to set addSnapshotListener and remove in populateViewHolder in RecyclerView Item?

Как установить addSnapshotListener и удалить в populateViewHolder в элементе RecyclerView?

Я реализовал RecyclerView с FirebaseUI-библиотекой Android.

Мои RecyclerView данные в реальном времени хорошо меняются, как только я их использую FirebaseRecyclerAdapter

В коллекции этот документ данных имеет тип поля как логическое значение, целое число, ссылка.

Я хочу использовать эту ссылку для получения данных в populateViewHolder с addSnapshotListener помощью.

Помогите мне! Вот мой код:

         FirebaseRecyclerAdapter<Conv, ConvViewHolder> firebaseConvAdapter = new FirebaseRecyclerAdapter<Conv, ConvViewHolder>(
Conv.class,
R.layout.users_single_layout,
ConvViewHolder.class,
conversationQuery
) {
@Override
protected void populateViewHolder(final ConvViewHolder convViewHolder, final Conv conv, int i) {

final String list_user_id = getRef(i).getKey();

final DocumentReference docRef = db.collection("cities").document(list_user_id);
docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot snapshot,
@Nullable FirebaseFirestoreException e)
{
if (e != null) {
Log.w(TAG, "Listen failed.", e);
return;
}

if (snapshot != null && snapshot.exists()) {
Log.d(TAG, "Current data: " + snapshot.getData());
} else {
Log.d(TAG, "Current data: null");
}
}
});
}
};

mConvList.setAdapter(firebaseConvAdapter);

Firebase говорит, что если вы добавите addSnapshotListener, то должны удалить его один раз, в этом нет необходимости Отсоединять прослушиватель


Когда вы больше не заинтересованы в прослушивании ваших данных, вы должны отключить прослушиватель, чтобы перестали вызываться обратные вызовы событий. Это позволяет клиенту прекратить использовать пропускную способность для получения обновлений. Вы можете использовать функцию отмены подписки на onSnapshot(), чтобы прекратить прослушивание обновлений.


Переведено автоматически
Ответ 1

Для достижения этого вам нужно использовать EventListener<DocumentSnapshot> вот так:

EventListener<DocumentSnapshot> eventListener = new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(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() методе:

@Override
protected void onStop() {
if (listenerRegistration != null) {
listenerRegistration.remove();
}
}

Кроме того, не забудьте добавить его снова после вызова вашего onStart() метода.

@Override
protected void onStart() {
super.onStart();
listenerRegistration = yourRef.addSnapshotListener(eventListener);
}

Когда вы вызываете addSnapshotListener для прослушивания обновлений в реальном времени, это означает, что вы подключаете прослушиватель, который вызывается при каждом изменении, происходящем в вашей базе данных. Итак, это происходит и при закрытии вашего приложения, поэтому обязательно отсоедините прослушиватели, прежде чем действие будет уничтожено.

Если в вашем приложении вам не нужно получать данные в реальном времени, то вы можете просто использовать get() вызов непосредственно по ссылке, который просто считывает документ только один раз. Поскольку он считывается только один раз, нет прослушивателя, который нужно удалять. Это соответствует addListenerForSingleValueEvent() используется в базе данных Firebase realtime.

Существует также более элегантный способ удаления прослушивателя, который заключается в передаче действия в качестве первого аргумента в методе addSnapshotListener(), поэтому Firestore может автоматически очищать прослушиватели при остановке действия.

ListenerRegistration lg = yourDocumentRef
.addSnapshotListener(YourActivity.this, eventListener);
Ответ 2

Существует также более элегантный способ удаления прослушивателя, который заключается в передаче действия в качестве первого аргумента в методе addSnapshotListener() , чтобы Firestore мог автоматически очищать прослушиватели при остановке действия. Цитата из блока


Это было очень важно. Я не искал "элегантный способ", но это была подсказка, почему мой прослушиватель иногда останавливается. Я удалил поле активности, и теперь прослушиватель не останавливается без моего прямого указания в случае изменения состояния активности.

java android firebase google-cloud-firestore