2016-05-04 2 views
0

В настоящее время я разрабатываю приложение для 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(), но, похоже, не применяет изменения на внешней стороне.

+0

Ответ Shadab объясняет это: вы не можете вернуть то, что еще не загружено. Вы также можете прочитать мой ответ здесь: http://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener. Он использует несколько слов для объяснения (хотя и в другом контексте: запись данных). –

ответ

2

Я думаю, что ваша проблема связана с асинхронным значением ValueEventListener.

OnDataChange называется асинхронно.

Вы должны использовать книги после вызова onDataChange.

2

addValueEventListener() будет получать данные от Firebase асинхронно. Ваш код показывает, что вы добавляете ValueEventListener, а затем печатаете System.out.println(books.size());. Это означает, что ваши журналы будут отображаться после добавления ValueEventListener (что не означает, что ваш прослушиватель вызывается). На данный момент ваш слушатель еще не вызывается, и это не так onDataChange(). Таким образом, вы никогда не сможете обновить счетчик вне области прослушивателя.

+0

Интересно. Как я могу выяснить, когда вызывается onDataChange()? –

+0

'onDataChange()' будет вызываться каждый раз, когда дочерние узлы в 'myFirebaseRef' будут изменены. –