将Firebase中的数据保存到列表中

时间:2016-05-04 19:55:45

标签: android firebase firebase-realtime-database

我目前正在开发一款处理图书翻译存储的Android应用。我使用Firebase在线保存所有数据,我可以毫不费力地从中提取数据并将其存储为Book对象。我在主类中有一个主要的书籍列表,用于存储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)。但是,如果我在该代码体之外调用相同的print语句(最后一行),它会给我0.我不知道为什么,因为它成功地将它添加到onDataChange()方法中但它似乎不适用外面的变化。

2 个答案:

答案 0 :(得分:2)

我认为你的问题是关于ValueEventListener的异步。

onDataChange被异步调用。

在调用onDataChange之后你必须使用这些书。

答案 1 :(得分:2)

addValueEventListener()将异步从Firebase获取数据。 您的代码描述的是您要添加ValueEventListener然后打印System.out.println(books.size());。这意味着在添加ValueEventListener之后会显示您的日志(这并不意味着您的侦听器被调用)。此时,您的侦听器尚未被调用,因此不是onDataChange()。因此,您无法获得听众范围之外的更新计数。