2016-05-04 34 views
0

我目前正在开发一个处理存储图书翻译的Android应用程序。我正在使用Firebase将所有数据保持在线状态,并且无需从数据中提取数据并将其存储为Book对象。我在主类中有一个主要的书籍列表,用于存储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)。但是,如果我在该代码体(最后一行)之外调用相同的print语句,它会给出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

每当'myFirebaseRef'下的子节点发生变化时,'onDataChange()'将被调用。 –