В настоящее время я разрабатываю приложение для Android, которое занимается хранением книжных переводов. Я использую Firebase для хранения всех данных в Интернете, и у меня нет проблем с извлечением данных из него и их хранением в качестве объектов книги. У меня есть главный список книг в основном классе, который хранит все книги из базы данных Firebase, однако список, похоже, не обновляется должным образом.Сохранение данных из Firebase в список
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());
}
В этом теле размер книг правильный (сейчас это всего лишь 1). Однако, если я вызываю тот же оператор печати за пределами этого тела кода (последняя строка), он дает мне 0. Я не знаю, почему, потому что он успешно добавляет его внутри метода onDataChange(), но, похоже, не применяет изменения на внешней стороне.
Ответ Shadab объясняет это: вы не можете вернуть то, что еще не загружено. Вы также можете прочитать мой ответ здесь: http://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener. Он использует несколько слов для объяснения (хотя и в другом контексте: запись данных). –