Метод ArrayList <String>возвращает пустой массив, получая данные из firebase - PullRequest
0 голосов
/ 04 декабря 2018

У меня проблема с возвратом ... так как для загрузки данных потребовалось несколько секунд, когда метод возвращает ArrayList, он все еще пуст.Фактически, если я поместил эти строки кода Log.v("array", String.valueOf(partecipantsArrayList));, сначала он напечатает 0, а затем напечатает заполненный массив.Так что я должен подождать, пока не вернется оператор return. Есть ли способ добиться этого?

public ArrayList<String> getPartecipantsList(){
    String email = getEmail();
    String groupTitle = getTitleBar();
    DocumentReference docRef = db.collection("users").document(email).collection("Group").document(groupTitle);

    docRef.get()
            .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<DocumentSnapshot> task) {


                        DocumentSnapshot document = task.getResult();


                        //Extracting participants ArrayList from the document
                        for(Object item : task.getResult().getData().values()) {

                            String[] values = String.valueOf(item).replace("[", "").replace("]", "").split(",");

                            for (String value : values){

                                    partecipantsArrayList.add(value);

                            }

                        }
                        partecipantsArrayList.remove(String.valueOf("["));
                        partecipantsArrayList.remove(partecipantsArrayList.size() - 1);
                        Log.v("array", String.valueOf(partecipantsArrayList));

                    }

                })

            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {

                }
            });


    return partecipantsArrayList;
}

1 Ответ

0 голосов
/ 04 декабря 2018

Это асинхронная задача, вы можете настроить этот код, как показано ниже.

изменить сигнатуру этого метода на return void

public void getPartecipantsList();

выполнить следующее действие после завершения

                @Override
                public void onComplete(@NonNull Task<DocumentSnapshot> task) {

                        ...............
                        partecipantsArrayList.remove(String.valueOf("["));
                        partecipantsArrayList.remove(partecipantsArrayList.size() - 1);

                        Log.v("array", String.valueOf(partecipantsArrayList));
                       // do your action by calling next method from here
                      //eg: setResultFromArray(partecipantsArrayList);
                    }

делать сбой действия или вызывать метод при сбоях на стороне onFailure.

                @Override
                public void onFailure(@NonNull Exception e) {
                     //......
                } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...