Это асинхронный вызов (он запускает фоновый процесс для выполнения запроса Firebase, и как только он выполняется, он выполняет ваш onComplete
слушатель), поэтому вы не можете ожидать, что данные будут под рукой сразу после выполнения вызов базы данных. Например, если ваша функция выглядит как
void getData() {
final List<MyData> list = new ArrayList<>();
db.collection("cities")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
Log.d(TAG, document.getId() + " => " + document.getData());
list.add(new MyData(document.getData()));
}
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
});
Log.d(TAG, "List size = " + list.size()); // will print 0
// list will be empty here, the firebase call will take hundreds
// to thousands of milliseconds to complete
}
Вам необходимо структурировать свою программу так, чтобы она могла ожидать поступления данных. Есть несколько способов сделать это. Можно было бы иметь list
членом класса, который заполняется слушателем onComplete
(тогда вы должны структурировать программу для обработки данных, поступающих в случайные моменты времени).
Другим способом было бы иметь процедуру обработки данных, которая принимает ArrayList
и что-то с ним делает. Этот метод может быть вызван из прослушивателя onComplete
, как только вы получите все данные. Например:
void getData() {
db.collection("cities")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
List<MyData> list = new ArrayList<>();
for (QueryDocumentSnapshot document : task.getResult()) {
Log.d(TAG, document.getId() + " => " + document.getData());
list.add(new MyData(document.getData()));
}
processData(list);
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
});
}
void processData(List<MyData> data) {
// do stuff with the data, or make a copy, or otherwise share it
// with the rest of your program
}