2015-12-30 3 views
32

Ich verwende Firebase Realtime Database zum Speichern und Abrufen von Daten für meine Android-Anwendung. In meiner Aktivität lade ich alle Daten (Beispiel: Liste der Benutzerdaten) von Firebase unter Verwendung einer childEventListener.Finden Sie heraus, ob childEventListener auf Firebase das Laden aller Daten abgeschlossen hat

Ich möchte einen Fortschrittsbalken anzeigen, solange die Daten nicht vollständig aus der Datenbank abgerufen werden. Wie überprüfe ich, ob alle Daten vollständig abgerufen wurden, damit ich den Fortschrittsbalken nach dem Laden der Daten schließen kann?

Antwort

66

Es gibt eine allgemeine Möglichkeit zu erkennen, wenn Firebase Synchronisierung der ersten Daten an einem bestimmten Speicherort erfolgt. Dieser Ansatz nutzt eine der Firebase event guarantees:

Wert Ereignisse werden immer dann ausgelöst, zuletzt und werden garantiert Updates von anderen Ereignissen enthalten, die vor aufgetreten, dass Snapshot erstellt wurde.

Also, wenn Sie sowohl ein ValueEventListener und ein ChildEventListener an einem bestimmten Ort, die ValueEventListener.onDataChange() garantiert werden nach all onChildAdded() Anrufen geschehen aufgerufen werden. Sie können dies wissen, verwenden, wenn der anfängliche Laden von Daten erfolgt:

ref.addListenerForSingleValueEvent(new ValueEventListener() { 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     System.out.println("We're done loading the initial "+dataSnapshot.getChildrenCount()+" items"); 
    } 
    public void onCancelled(FirebaseError firebaseError) { } 
}); 
ref.addChildEventListener(new ChildEventListener() { 
    public void onChildAdded(DataSnapshot dataSnapshot, String previousKey) { 
     System.out.println("Add "+dataSnapshot.getKey()+" to UI after "+previousKey); 
    } 
    public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
    } 
    public void onChildRemoved(DataSnapshot dataSnapshot) { 
    } 
    public void onChildMoved(DataSnapshot dataSnapshot, String s) { 
    } 
    public void onCancelled(FirebaseError firebaseError) { } 
}); 

In meinem Test ausführen, um diese Ergebnisse in:

Add -K2WLjgH0es40OGWp6Ln to UI after null 
Add -K2YyDkM4lUotI12OnOs to UI after -K2WLjgH0es40OGWp6Ln 
Add -K2YyG4ScQMuRDoFogA9 to UI after -K2YyDkM4lUotI12OnOs 
... 
Add -K4BPqs_cdj5SwARoluP to UI after -K4A0zkyITWOrxI9-2On 
Add -K4BaozoJDUsDP_X2sUu to UI after -K4BPqs_cdj5SwARoluP 
Add -K4uCQDYR0k05Xqyj6jI to UI after -K4BaozoJDUsDP_X2sUu 
We're done loading the initial 121 items 

So könnte man das onDataChanged() Ereignis verwenden, um die Statusleiste zu verbergen.

Aber eine Sache zu beachten: Firebase nicht nur laden Daten. Es kontinuierlich synchronisiert Daten vom Server an alle verbundenen Clients. Daher gibt es keinen Moment, in dem die Daten vollständig abgerufen werden.

+0

Große Antwort! Danke für deine Antwort. Es klappt! Ihre Antwort ist wirklich hilfreich. aber ich möchte etwas fragen, warum addListenerForSingleValueEvent onDataChange immer noch aufgerufen wird, wenn die Referenz geändert wird? wird addListenerForSingleValueEvent gerade einmal aufgerufen, dann entfernt oder ich bin falsch? –

+0

Wenn Sie einen Listener mit 'addListenerForSingleValueEvent()' hinzufügen, wird er für genau ein Wert-Ereignis aufgerufen. Danach wird es automatisch entfernt. Lesen Sie mehr darüber in der Dokumentation: https://www.firebase.com/docs/android/guide/retrieving-data.html#section-reading-once –

+0

So wird 'onDataChange()' jedes Mal aufgerufen, wenn der Verweis in Firebase ist geändert oder hinzugefügt? oder nur einmal aufgerufen, dann wird der Listener entfernt? Wenn ich 'addListenerForSingleValueEvent()' benutze, nachdem 'onDataChange()' aufgerufen wurde, wird der Listener nicht aus der Referenz entfernt, und wenn ich einen neuen Wert in der Referenz hinzufüge, wird 'onDataChange()' aufgerufen nochmal. –

4

Ich habe es auf ganz einfache Weise getan. Ich lasse ein int zählen und dann jedes Mal, wenn es innerhalb der Funktion kommt, inkrementiere ich es und überprüfe es, ob es gleich der Gesamtzahl von Kindern ist. wenn es gleich ist, dann können Sie den Fortschrittsbalken stoppen

+0

und mein engish ist wenig schwach: D – osama

+0

Wie werden Sie nach dem Hörer loswerden? Oder müssen wir uns darüber keine Sorgen machen? – Lion789

+0

nein Sie brauchen sich keine Sorgen über den Hörer – osama

Verwandte Themen