2016-06-25 11 views
3

データセットoncreate()をロードします。FirebaseでデータをロードするonCreate()

データは変更されませんので、私は1時間ローダーを使用します。

protected void onCreate(Bundle savedInstanceState) { 
    .... 

    mDatabase.child("users").child(userId).addListenerForSingleValueEvent(
     new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       currentUser = dataSnapshot.getValue(Users.class); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Log.w(TAG, "error:", databaseError.toException()); 
      } 
    }); 
    String name = currentUser.getName(); 
    .... 
} 

をしかし、データが入手できない、のgetName関数はnullオブジェクトで呼び出されます。

どのようにしてデータを取得できますか?

+0

あなたはmDatabase初期化子を投稿できますか? –

+0

リスナ 'onDataChange'の内部で名前を探しているのは非同期呼び出しなので、 – adolfosrs

答えて

3

問題はFirebaseが非同期リスナーをデータベース参照に使用し、nameをNULL currentUserと変数に設定することです。

ファイアベースのコールバックの中に、varという名前をファイナルとして、リスナーの前に宣言し、その値を設定してみます。

更新: "オーバーライド" 機能を実装して使用する方法 例:

final String name; 
mDatabase.child("users").child(userId).addListenerForSingleValueEvent(
new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      currentUser = dataSnapshot.getValue(Users.class); 
      name = currentUser.getName(); 

      fooFunc(name); // calling a function with data 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Log.w(TAG, "error:", databaseError.toException()); 
     } 
}); 

@Override 
public void fooFunc(String name) { 
    // name != null, when called from the the callback 
    // dont forget to check it 
} 
+0

Jupはうまくいきます:)しかし、別の問題があります。私は以前に解雇されたonMapReady(GoogleMapマップ)メソッドも持っています。この関数では、 'onDataChange'からいくつかのデータが必要です。これどうやってするの? – Zoker

+0

希望のデータを取得した後で、コールバック内でその関数を呼び出すこともできます。 –

+0

しかし、@Override関数です。私はそれをonCreateの中に移動できますか? – Zoker

関連する問題