Как получить данные о firebase firestore Android? - PullRequest
0 голосов
/ 25 апреля 2020

Я долго искал и, похоже, не могу найти ничего, что могло бы помочь мне ...

Я хочу получить данные из коллекции Firebase FireStore, на которую я ссылаюсь (timeEntryTable). В отладчике я вижу, что к моим данным обращаются правильно, но когда я выхожу из метода, кажется, что все прошло ...

private void getTimes(){
        float totalTime = 0;

        timeEntryTable
                .whereEqualTo("person", "Alexandre")
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                            for (QueryDocumentSnapshot document : task.getResult()) {

                                TimeEntry timeEntry = new TimeEntry(document.getData());
                                times.add(timeEntry.getTime());

                                Log.d(TAG, document.getId() + " => " + document.getData());
                            }
                        } else {
                            Log.d(TAG, "Error getting documents: ", task.getException());
                        }
                    }
                });
        System.out.println("times = " + times);
    }

В этом фрагменте times является закрытый член ArrayList и TimeEntry - это POJO, который имеет структуру документов в коллекции.

Я действительно вижу в отладчике, что times заполнен правильными данными, но когда я вызываю System.out.println("times = " + times);, значение равно [] ... Есть что-то, что я не правильно делаю?

Спасибо:)

1 Ответ

0 голосов
/ 25 апреля 2020

Операция Firestore get() и все ее API-интерфейсы асинхронны и возвращаются немедленно, до того как данные станут доступны. Ваш код продолжает выполняться, пока запрос завершается. Через некоторое время обратный вызов, который вы добавили с помощью addOnCompleteListener, будет вызван результатами запроса.

Первый раз, когда вы сможете использовать результаты, находится внутри самого обратного вызова. Вы не можете быть уверены, что любой другой доступ к вашему массиву times будет содержать что-либо. Это означает, что вам придется строить свою программу на основе этих асинхронных API, а не в зависимости от построчного выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...