2017-02-09 15 views
1

addValueEventListener()から文字列を受け取って、データベースFirebaseからデータを再販する方法をお伝えします。データは正しく到着します。addValueEventListenerから文字列を取得Firebase

しかし、そのメソッドから文字列を取得して別のメソッドで使用する場合は、何も返しません。

ヒントはありますか?

私は既にputExtrasを試してみましたが、目的に応じてメソッドを作成しましたが、動作しませんでした。

final DatabaseReference mPostReference = FirebaseDatabase.getInstance().getReference().child("user-daily").child(getUid()).child("2017-Year"); 
mPostReference.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     final ArrayList<String> labels = new ArrayList<String>(); 
     for (DataSnapshot data : dataSnapshot.getChildren()){ 
      final DailyItem dailyItem = data.getValue(DailyItem.class); 
      labels.add(dailyItem.mese); 



     } 
     title.setText(labels.get(position)); 

     a = title.getText().toString(); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     Toast.makeText(view.getContext(),"database error", 
       Toast.LENGTH_SHORT).show(); 
    } 
}); 

//this return null... why? 
String title = a; 

答えて

3

データはFirebaseから非同期にロードされます。 title = aを実行するまでには、onDataChangeメソッドはまだ呼び出されていません。これを確認するには、デバッガにいくつかのブレークポイントを設定します。これは、非同期ロードの仕組みを理解する上で重要です。

解決策は、まず「オブジェクトを取得してからタイトルを使ってblablaを実行する」から「オブジェクトを取得し始めます。オブジェクトが利用可能になったら、タイトルでblablaを実行します。

のコードでは、これはに変換します。Firebaseに新しい

final DatabaseReference mPostReference = FirebaseDatabase.getInstance().getReference().child("user-daily").child(getUid()).child("2017-Year"); 
mPostReference.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     final ArrayList<String> labels = new ArrayList<String>(); 
     for (DataSnapshot data : dataSnapshot.getChildren()){ 
      final DailyItem dailyItem = data.getValue(DailyItem.class); 
      labels.add(dailyItem.mese); 



     } 
     title.setText(labels.get(position)); 

     // Do blabla with the title 
     String title = title.getText().toString(); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     Toast.makeText(view.getContext(),"database error", 
       Toast.LENGTH_SHORT).show(); 
    } 
}); 

多くの開発者(および他の現代のWeb APIは、これらすべての作業として、この方法)この問題との闘い。 this list of search results 01に

+0

ありがとうございました!しかし、私はまだこの文字列を引き出すことができないので、これは私の問題を解決しません。私はあなたが私を残したアプリケーションを見ます。ありがとうございました。 – hulon

+0

非同期コードを同期させようとしています。感謝を理解するhttp://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener/33204705#33204705 –

+0

を参照してください!私は後で私に与えたリンクの答えを見るでしょう、私はあなたに感謝します。最後の井戸、ちょうど推測。 Firebaseの特定のローカル証明書を除いて、たとえば共有設定を使用している場合は、メソッドの外でそれを取得できますか? – hulon

0

あなたはGenericTypeIndicatorを使用してリスト全体を検索することができます。 here

関連する問題