0

I am new to java. I have a firestore_member_list. In firestore_member_list, it contains values: ["steve","ram","kam"]. I am using for loop to pass values one by one.

loadingbar.show()
for( int k=0; k<firestore_member_list.size();k++){
        String member_name = firestore_member_list.get(k);
        final DocumentReference memDataNameCol = firestoredb.collection("member_collection").document(member_name);
        memDataNameCol.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if (task.isSuccessful()) {
                DocumentSnapshot document = task.getResult();
                if (document.exists()) {
//                      In here, I am retreiveing the document data from firestore and assigning it to the ArrayList which is `all_mem_data`

                        all_mem_data.add(document.get("member_name").toString());
                        all_mem_data.add(document.get("member_address").toString());
                        Toast.makeText(getActivity(), "all mem data array"+all_mem_data.toString(),
                                Toast.LENGTH_LONG).show();
                }
                }
        }
        });
}
Log.d("all_mem_data",all_mem_data)
loadingbar.hide()

I know firestore executes asynchronously. Since firestore retrieves data asynchronous, before filling the array of all_mem_data, the last line gets executed and shows the empty array. How to wait for the array to get filled and after filling,execute the last two lines. Please help me with solutions.

1 Answer 1

1

Any code that needs the data from the database, needs to be inside the onComplete that fires when that data is available.

If you want to wait until all documents are loaded, you can for example keep a counter:

loadingbar.show()
int completeCount = 0;
for( int k=0; k<firestore_member_list.size();k++){
    String member_name = firestore_member_list.get(k);
    final DocumentReference memDataNameCol = firestoredb.collection("member_collection").document(member_name);
    memDataNameCol.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            ...

            if (completeCount++ == firestore_member_list.size()-1) {
                Log.d("all_mem_data",all_mem_data)
                loadingbar.hide()
            }
        }
    });

}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.