2016-11-06 3 views
0

onCreate()の中に以下のメソッドを挿入します。このメソッドを起動すると、このメソッドが起動されます。しかしmNameValueEventListener()の外にしようとすると、nullが返され、アプリがクラッシュします。データを取得するFirebaseベースのデータなしメソッド

誰でもこの問題が発生する理由を知っていますか? Firebaseはまだデータを取得していなかったので、あなたがやる時にはまだだ

ValueEventListener postListener = new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      UserDetails info = dataSnapshot.getValue(UserDetails.class); 
      Log.d(TAG, String.valueOf(dataSnapshot)); 

      mName = info.getName(); 
      **Log.d(TAG, mName); // HERE GET THE NAME** 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Log.w(TAG, "getUser:onCancelled", databaseError.toException()); 
     } 
    }; 
    mDatabase.child("Admin") 
      .child("Info") 
      .child(uid) 
      .addValueEventListener(postListener); 

    **Log.d(TAG, mName); // HERE GET NULL** 

答えて

1

:Firebaseはデータを持って前に、この行が実行されてから

Log.d(TAG, mName); 

mNameは現在、nullです。

これを解決するには、Log.d(TAG, mName)onDataChangeの方法があります。それ以外の場合は、まだ値を設定していないので(Firebaseはまだ値を取得していないので)、nullになります。

1

他の人が言ったように、Firebaseデータベースのすべてのデータは非同期に読み込まれます。

リスナーを取り付けた後、リスナー

を取り付ける前に:

あなたが期待するかもしれないものとは異なり
Log.d(TAG, "Before attaching listener"); 
mDatabase.child("Admin") 
     .child("Info") 
     .child(uid) 
     .addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     Log.d(TAG, "In listener's onDataChange"); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     Log.w(TAG, "getUser:onCancelled", databaseError.toException()); 
    } 
}); 
Log.d(TAG, "After attaching listener"); 

、これの出力は次のとおりです。それはあなたのコードにいくつかのより多くのログステートメントを追加することでこれを確認するのが最も簡単です

リスナーのOnDataChangeのインサイド

非同期動作を処理する方法は、問題を再構築することです。

あなたのコードは次のように書かれています:最初にデータをロードし、ログに記録します。

あなたが問題をリフレーム場合:「データがロードされるたびに、我々はそれをログ」、あなたはこのようなコードを取得:

mDatabase.child("Admin") 
     .child("Info") 
     .child(uid) 
     .addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     UserDetails info = dataSnapshot.getValue(UserDetails.class); 
     Log.d(TAG, String.valueOf(dataSnapshot)); 

     mName = info.getName(); 
     Log.d(TAG, mName); 

    } 

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

をので、データを必要とするすべてのコードは、onDataChange()内である必要があります。また、独自のカスタムコールバックメソッドを作成し、onDataChange()から呼び出すこともできます。しかし、ロジックは常に同じです。つまり、データを必要とするコードは、 からデータが利用可能になるとからトリガされます。

+0

偉大な説明、ありがとうございます。しかし、これは別の質問から出てきます。データを別のアクティビティにその場で渡すにはどうすればいいですか?私はonDataChangeメソッドの中にsqliteを使ってデータを格納しようとしました。しかし、それを取得するには、私は、アプリケーションを閉じて再オープンする必要があります。 – user3606920

関連する問題