Jak działa utrzymywanie
Klient Firebase przechowuje kopię wszystkich danych masz aktywnego słuchania w pamięci. Po rozłączeniu ostatniego słuchacza dane są usuwane z pamięci.
Jeśli włączysz trwałość dysku w aplikacji Android z Firebase:
Firebase.getDefaultConfig().setPersistenceEnabled(true);
Klient Firebase będzie utrzymywać lokalną kopię (na dysku) wszystkich danych, że aplikacja została niedawno słuchałem.
Co się dzieje, kiedy dołączyć słuchacza
powiedzieć, że mają następujący ValueEventListener
:
ValueEventListener listener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
System.out.println(snapshot.getValue());
}
@Override
public void onCancelled(FirebaseError firebaseError) {
// No-op
}
};
Po dodaniu ValueEventListener
do lokalizacji:
ref.addValueEventListener(listener);
// OR
ref.addListenerForSingleValueEvent(listener);
Jeśli wartość z lokalizacja znajduje się w lokalnej pamięci podręcznej dysku, klient Firebase natychmiast wywoła numer onDataChange()
dla tej wartości z lokalnej pamięci podręcznej. Jeśli następnie zainicjuje czek z serwerem, poprosi o aktualizację wartości. To może ponownie wywołać onDataChange()
ponownie, jeśli nastąpiła zmiana danych na serwerze, ponieważ została ostatnio dodana do pamięci podręcznej.
Co się dzieje, gdy używasz addListenerForSingleValueEvent
Podczas dodawania zdarzeń słuchacza pojedyncza wartość w tej samej lokalizacji:
ref.addListenerForSingleValueEvent(listener);
Klient Firebase będzie (jak w poprzedniej sytuacji) niezwłocznie powołać onDataChange()
dla wartość z lokalnej pamięci podręcznej dysku. Będzie to , a nie wywoływać onDataChange()
więcej razy, nawet jeśli wartość na serwerze okaże się inna. Zwróć uwagę, że zaktualizowane dane będą nadal wymagane i zwrócone przy kolejnych żądaniach.
ten pokryto uprzednio w How does Firebase sync work, with shared data?
roztworu i obejście
Najlepszym rozwiązaniem jest użycie addValueEventListener()
, zamiast detektora zdarzenia pojedynczych wartości. Program nasłuchujący o wartości normalnej otrzyma zarówno natychmiastowe zdarzenie lokalne, jak i potencjalną aktualizację z serwera.
Jako obejście można również call keepSynced(true)
w lokalizacjach, w których używany jest odbiornik zdarzeń o pojedynczej wartości. Zapewnia to aktualizację danych po każdej zmianie, co drastycznie zwiększa szansę, że detektor zdarzeń o pojedynczej wartości zobaczy aktualną wartość.
Dziękuję. Teraz rozumiem odpowiedź z linku. –
Dzięki za perfekcyjną ilustrację. Ale keepSynced (true) i addValueEventListener będą utrzymywać otwarte połączenie przez cały czas. W przeciwieństwie do keepSynced (false) i addListenerForSingleValueEvent pozwoli firebase na rozłączenie się po pewnym czasie. Jak mogę wymusić ręczną aktualizację? –
To niewygodne zachowanie sprawia, że testowanie jest prawie niemożliwe. –