Come funziona la persistenza
Il cliente Firebase mantiene una copia di tutti i dati si sta attivamente ascoltando in memoria. Quando l'ultimo ascoltatore si disconnette, i dati vengono scaricati dalla memoria.
Se si abilita la persistenza su disco in un'applicazione Android con Firebase:
Firebase.getDefaultConfig().setPersistenceEnabled(true);
Il cliente Firebase manterrà una copia locale (su disco) di tutti i dati che l'applicazione ha recentemente ascoltato.
Cosa succede quando si collega un ascoltatore
Diciamo che avete il seguente ValueEventListener
:
ValueEventListener listener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
System.out.println(snapshot.getValue());
}
@Override
public void onCancelled(FirebaseError firebaseError) {
// No-op
}
};
Quando si aggiunge un ValueEventListener
in una posizione:
ref.addValueEventListener(listener);
// OR
ref.addListenerForSingleValueEvent(listener);
Se il valore della la posizione è nella cache del disco locale, il client Firebase invocherà immediatamente onDataChange()
per quel valore dalla cache locale. Se poi avvierà anche un controllo con il server, per chiedere eventuali aggiornamenti del valore. Lo può successivamente richiamare onDataChange()
di nuovo se c'è stato un cambiamento dei dati sul server dall'ultima volta che è stato aggiunto alla cache.
Cosa succede quando si utilizza addListenerForSingleValueEvent
Quando si aggiunge un listener di eventi singolo valore nella stessa posizione:
ref.addListenerForSingleValueEvent(listener);
Il client Firebase sarà (come nella situazione precedente) immediatamente richiamare onDataChange()
per la valore dalla cache del disco locale. Sarà non invocare lo onDataChange()
più volte, anche se il valore sul server risulta diverso. Si noti che i dati aggiornati verranno comunque richiesti e restituiti in caso di richieste successive.
Questo era coperto precedentemente in How does Firebase sync work, with shared data?
Solution e soluzione
La soluzione migliore è quella di utilizzare addValueEventListener()
, invece di un ascoltatore evento singolo valore. Un listener di valori regolari otterrà sia l'evento locale immediato che il potenziale aggiornamento dal server.
Come soluzione alternativa è possibile anche call keepSynced(true)
nelle posizioni in cui si utilizza un listener di eventi a valore singolo. Ciò garantisce che i dati vengano aggiornati ogni volta che cambia, il che aumenta drasticamente la possibilità che il listener di eventi a valore singolo visualizzi il valore corrente.
Grazie. Capisco ora dalla risposta del link .. –
Grazie per l'illustrazione perfetta. Ma keepSynced (true) e addValueEventListener manterranno una connessione aperta tutto il tempo. Al contrario di keepSynced (false) e addListenerForSingleValueEvent consentirà al firebase di disconnettersi in seguito. Come posso forzare un aggiornamento manuale una volta? –
Che comportamento sconveniente, rende quasi impossibile la verifica. –