Проблемы с массивом в addChildEventListener (Firebase) - PullRequest
0 голосов
/ 19 марта 2019
Integer scores[] = new Integer[10];
int count = 0;

У меня есть некоторые данные, которые я хочу поместить в array.Я помещаю его в onChildAdded , но если мне нужно получить данные из массива из onChildAdded , консоль показывает "null" .

Если я попытаюсь получить данные массива в onChildAdded , это будет успешно

data.child("scores").addChildEventListener(new ChildEventListener() {
                    @Override
                    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                        count++;
                        scores[count] = dataSnapshot.getValue(Integer.class);
                    }

                    @Override
                    public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                    }

                    @Override
                    public void onChildRemoved(DataSnapshot dataSnapshot) {

                    }

                    @Override
                    public void onChildMoved(DataSnapshot dataSnapshot, String s) {

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

int i = scores[1];

ВАЖНЫЙ МОМЕНТ

Например, если я буду использовать операцию FOR

for (int i = 0; i < 10; ++i) {
        scores[i] = i;
    }

    int i = scores[3];

i не будет нулевым

1 Ответ

2 голосов
/ 19 марта 2019

API Firebase имеют значение asynchronous, что означает, что каждый из этих методов: onChildAdded(), onChildChanged() и т. Д., Возвращается сразу после его вызова, и обратный вызов из Задачи, который он возвращает, будет вызван через некоторое время. Там нет никаких гарантий о том, сколько времени это займет. Таким образом, получение этих данных может занять от нескольких сотен миллисекунд до нескольких секунд. Поскольку этот метод немедленно возвращается, массив scores еще не был заполнен из обратного вызова, и поэтому он пуст.

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

Быстрое решение этой проблемы - переместить следующие строки кода:

for (int i = 0; i < 10; ++i) {
    scores[i] = i;
}
int i = scores[3];

Внутри метода onChildAdded(), где доступны данные.

Если вам нужно зациклить ваш массив score за пределами обратного вызова, я рекомендую вам посмотреть последнюю часть моего ответа из этого поста , в котором я объяснил, как он может быть сделано с помощью пользовательского обратного вызова. Вы также можете взглянуть на это видео для лучшего понимания.

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