我目前正在开发一款处理图书翻译存储的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()方法中但它似乎不适用外面的变化。
答案 0 :(得分:2)
我认为你的问题是关于ValueEventListener的异步。
onDataChange被异步调用。
在调用onDataChange之后你必须使用这些书。
答案 1 :(得分:2)
addValueEventListener()
将异步从Firebase
获取数据。
您的代码描述的是您要添加ValueEventListener
然后打印System.out.println(books.size());
。这意味着在添加ValueEventListener
之后会显示您的日志(这并不意味着您的侦听器被调用)。此时,您的侦听器尚未被调用,因此不是onDataChange()
。因此,您无法获得听众范围之外的更新计数。