Я столкнулся с проблемой, связанной с базой данных Firebase Realtime и, в частности, с прослушивателем событий значения, который срабатывает более одного раза. Кажется, что когда состояние Интернета несколько раз меняется с включенного на выключенное и устройство наконец стабильно соединение метод обратного вызова onDataChange (DataSnapshot dataSnapshot) слушателя вызывается с dataSnapshot нулевого содержимого. Кажется, что база данных реального времени относится к локальному кешу приложения, и в этом случае я не хранят в нем никаких данных. Я подключаю слушателя внутри Activity onStart () или когда устройство установило какое-то соединение; Я отключаю слушателя внутри метода Activity onStop () или когда устройство теряет подключение к Интернету. Единовременно существует только один экземпляр данного слушателя, и каждое присоединение имеет соответствующее действие отсоединения, выполняемое при необходимости. Я попытался подождать некоторое время между изменением состояний подключения перед подключением слушателя и повторно подключить слушателя, если снимок данных возвращает значение null. Ни один из них не работал. Пожалуйста, посоветуйте решение.
Пример кода внутри Activity:
private ValueEventListener listener;
private Query query;
private boolean hasAttachedListener;
private Query getDatabaseReference() {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
return reference.child(“some child ref”)
.child(“other child ref 2 ”);
}
private ValueEventListener getDatabaseListener() {
return new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d(“firebase”, dataSnapshot.toString());
//issue here datasnapshot is null sometimes
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(“firebase”, databaseError.getDetails());
}
};
}
/**
* Attaches listener
*/
public void addListener() {
if (!hasAttachedListener) {
query = getDatabaseReference();
listener = getDatabaseListener();
query.addValueEventListener(listener);
hasAttachedListener = true;
}
}
/**
* Detaches the attached listener
*/
public void removeListener() {
if (hasAttachedListener) {
query.removeEventListener(listener);
query = null;
listener = null;
hasAttachedListener = false;
}
}
@Override
protected void onStart() {
super.onStart();
addListener();
}
@Override
protected void onStop() {
super.onStop();
removeListener();
}
@Override
protected void onNetworkDisconnected() {
super.onNetworkDisconnected();
// invoked when internet connection is lost
removeListener();
}
@Override
protected void onNetworkReconnected() {
super.onNetworkReconnected();
// invoked when internet connection is restored
addListener();
}
onNetworkDisconnected
иonNetworkReconnected
, потому что эти методы не нужны? - person Alex Mamo   schedule 10.07.2018