2016-05-04 11 views
0

Ich entwickle gerade eine Android-App, die sich mit der Speicherung von Buchübersetzungen beschäftigt. Ich verwende Firebase, um alle Daten online zu speichern, und ich habe keine Probleme, Daten daraus zu ziehen und sie als Buchobjekte zu speichern. Ich habe eine Hauptliste von Büchern in der Hauptklasse, in der alle Bücher aus der Firebase-Datenbank gespeichert sind. Die Liste scheint jedoch nicht ordnungsgemäß aktualisiert zu werden.Speichern von Daten aus Firebase in einer Liste

public static List<Book> books = new ArrayList<Book>(); 

protected void onCreate(Bundle savedInstanceState) { 
    myFirebaseRef.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot snapshot) { 
      for (DataSnapshot bookSnapshhot : snapshot.getChildren()) { 
       Book book = bookSnapshhot.getValue(Book.class); 
       books.add(book); 
       System.out.println(book.getAuthor() + " - " + book.getTitle()); 
       for (Chapter chapter : book.getChapters()) { 
        System.out.println(chapter.getTitle()); 
       } 
       for (Genre genre : book.getGenres()) { 
        System.out.println(genre.getGenre()); 
       } 
       System.out.println(books.size()); 
      } 
     } 
     @Override public void onCancelled(FirebaseError error) { } 
    }); 
    System.out.println(books.size()); 
} 

In diesem Körper ist die Größe der Bücher korrekt (im Moment ist es nur 1). Wenn ich jedoch die selbe print-Anweisung außerhalb dieses Code-Körpers (der letzten Zeile) anrufe, gibt es mir 0. Ich weiß nicht warum, denn es fügt es erfolgreich in die onDataChange() Methode ein, aber es scheint die Änderungen nicht anzuwenden draußen.

+0

Shadabs Antwort erklärt es: Sie können jetzt nichts zurückgeben, das noch nicht geladen wurde. Vielleicht möchten Sie auch meine Antwort hier lesen: http://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener. Es verwendet ein paar mehr Wörter, um es zu erklären (wenn auch in einem anderen Kontext: Schreiben von Daten). –

Antwort

2

Ich denke, dass Ihr Problem über die asyncronous des ValueEventListener ist.

Der onDataChange wird asynchron aufgerufen.

Sie müssen die Bücher verwenden, nachdem der onDataChange aufgerufen wurde.

2

Die addValueEventListener() ruft die Daten asynchron von Firebase ab. Was Ihr Code darstellt, ist, dass Sie ValueEventListener hinzufügen und dann System.out.println(books.size()); drucken. Das bedeutet, dass Ihre Protokolle angezeigt werden, nachdem Sie ValueEventListener hinzugefügt haben (was nicht bedeutet, dass Ihr Listener aufgerufen wird). Zu diesem Zeitpunkt wird Ihr Listener noch nicht aufgerufen und ist nicht onDataChange(). Daher werden Sie nie außerhalb des Listenerbereichs eine aktualisierte Anzahl erhalten.

+0

Interessant. Wie kann ich herausfinden, wann onDataChange() dann aufgerufen wird? –

+0

'onDataChange()' wird immer dann aufgerufen, wenn die Kindknoten unter 'myFirebaseRef' geändert werden. –

Verwandte Themen