2016-05-04 10 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() 'が呼び出されます。 –

関連する問題