2016-10-04 12 views
1

Firebaseでデータを作成した後。私はFirebaseからデータを取得しようとします。しかし、私は問題があると思います。ref.addChildEventListener(childEventListener)の前にLog.d(TAG、list.size())が実行されている可能性があります。コンプリート。誰が私を助けられるか ?Firebaseのコールバックandroid

public class NewFirebase extends AppCompatActivity { 

    List <Product> list = new ArrayList < >(); 
    private static final String TAG = "Firebase"; 
    DatabaseReference ref; 
    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Firebase.setAndroidContext(this); 
     ref = FirebaseDatabase.getInstance().getReference(); 
     ChildEventListener childEventListener = new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) { 
       Log.d(TAG, "onChildAdded:" + dataSnapshot.getKey()); 

       // A new comment has been added, add it to the displayed list 
       Product comment = dataSnapshot.getValue(Product.class); 
       for (DataSnapshot child: dataSnapshot.getChildren()) { 
        Product post = child.getValue(Product.class); 
        list.add(post); 
       } 
       // ... 
      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) { 
       Log.d(TAG, "onChildChanged:" + dataSnapshot.getKey()); 

      } 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 
       Log.d(TAG, "onChildRemoved:" + dataSnapshot.getKey()); 

      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) { 
       Log.d(TAG, "onChildMoved:" + dataSnapshot.getKey()); 

      } 

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

      } 
     }; 
     ref.addChildEventListener(childEventListener); 
     Log.d(TAG, list.size() + ""); 
    } 

    class RetrievingData extends AsyncTask < Void, Void, Void > { 

     @Override 
     protected Void doInBackground(Void...voids) { 

      return null; 

     } 
    } 
} 
+0

addValueEventListenerを使用する必要があります。 addChildEventListener(childEventListener);完了しますが、次に何をしますか? –

+0

そのデータは非同期で読み込まれるため、アプリケーションのコードで利用できるようになるまでには時間がかかることがあります。まだ読み込まれていないものを返すことはできません。非同期動作の詳細については、このQ&Aを参照してください。http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call –

+0

ref.addChildEventListener(childEventListener ); Log.d(TAG、list.size())が実行される前に完了します。 – TungLoGach

答えて

1

コードをどのように構造化しているか、またはコールバック/リスナー自体の定義をもう一度見てみる必要があります。

addChildEventListener()メソッドは、コールバックを割り当て、結果を取得するためのクエリを開始します。それはもちろん、バックグラウンドで行われます。

リスナーを使用すると、そのように動作することはありません。そのため、リスナーを使用すると、行単位で実行されないためです。彼らから何らかの結果を得るには、コードをメソッドの中に入れなければなりません。ミリ秒、秒、さらには数分かかることもありますが、実行に投稿された次の行の実行より速くなるとは思わないでください。

1

https://www.firebase.com/docs/android/guide/retrieving-data.htmlをご覧ください。
あなたがFirebaseデータベースから取得し、リストのサイズを確認したい場合は、あなたが参照する前に実行はい `Log.d(TAG、はlist.size())の代わりにaddChildEventListener

List<Product> commentList = new ArrayList<>(); 
myRef.addValueEventListener(new ValueEventListener() { 
    public void onDataChange(DataSnapshot snapshot) { 
     for (DataSnapshot postSnapshot: snapshot.getChildren()) { 
      Product comment = postSnapshot.getValue(Product.class); 
      commentList.add(comment); 
     } 
     // here you can print the size of your list 
     Log.d(TAG,list.size()) 
    } 

    public void onCancelled(FirebaseError firebaseError) { 
     System.out.println("The read failed: " + firebaseError.getMessage()); 
    } 
}); 
関連する問題