2017-11-28 10 views
0

Firebaseデータベースがあります。今私のonCreateメソッドでは、ValueEventListener()を使っていくつかのデータを読み込もうとしています。私はそのデータを読んで、ハッシュマップにローカルに保管します。その後、私はローダーとアダプターを使用しています。ファイヤーベースデータベースからのデータの読み込みが遅い

使用しているアダプタでは、前にデータベースから読み込んだデータを使用したいと思います。 しかし、アダプタが呼び出されるとハッシュマップは常に空です。

アンドロイドスタジオでログを表示すると、イベントリスナーが最終的に呼び出されますが、アダプタが実行された後に表示されます。

イベントリスナーは常にバックグラウンドスレッドで実行されるため、遅延が発生したのはなぜですか?はいの場合、データがfirbaseデータベースから読み取られた後でのみ、アダプタが呼び出されるようにするにはどうすればよいですか。

Here彼は私のコードにリンクしています。

+1

コードを説明する代わりに、質問して実際のコードを含めるように編集します。このような[MCVE](http://stackoverflow.com/help/mcve)は、コード関連の質問に対する助けを得るチャンスを最大限に生かす最良の方法です。 –

+0

@FrankvanPuffelenご意見ありがとうございます。ここに私のコードへのリンクがあります。 [リンク](https://gist.github.com/Sourabhlpu/e92d5d21fc6338bf8ccbc2fd44b47182) –

+0

@FrankvanPuffelenによると、*あなたが求めている実際のコードが含まれています。リンクや画像をリンクブレイクとして使用して質問や埋め込み画像を無効にしないでください。答えに既存のコードを再入力する必要があります。 [よくある質問をするにはどうすればよいですか?](https://stackoverflow.com/help/how-to-ask)と[最小限で完全で検証可能なサンプルを作成するにはどうすればいいですか? ](https://stackoverflow.com/help/mcve) – Jay

答えて

0

あなたはほとんどそこにいますが、もう1つ必要なことがあります。 HashMapの宣言をonDataChange()メソッド内に移動する必要があります。それ以外の場合は常に空になります。これは、マップにこれらの値を追加しようとする前に呼び出されるonDataChange()メソッドの非同期動作のために発生しています。したがって、コードは次のようになります。

ValueEventListener valueEventListener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     Map<String, String> mBookmarkIds = new HashMap<>(); 
     for(DataSnapshot bookmarkIdSnapshot : dataSnapshot.getChildren()) { 
      mBookmarkIds.put(bookmarkIdSnapshot.getValue().toString(), bookmarkIdSnapshot.getKey()); 
     } 
     Log.v(LOG_TAG, "the bookmark ids are " + mBookmarkIds); 
     NewsPreferences.setmBookmarkIds(mBookmarkIds); 

    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) {} 
}; 
+0

それは問題を解決しました。どうもありがとう。 –

+0

実際には、アプリケーションをクラッシュさせないハッシュマップを初期化しました。しかし、ローダーの起動時にはまだハッシュマップは空です。 –

+0

データベース構造も追加します。 –

関連する問題