API Firebase имеют значение asynchronous
, что означает, что каждый из этих методов: onChildAdded()
, onChildChanged()
и т. Д., Возвращается сразу после его вызова, и обратный вызов из Задачи, который он возвращает, будет вызван через некоторое время. Там нет никаких гарантий о том, сколько времени это займет. Таким образом, получение этих данных может занять от нескольких сотен миллисекунд до нескольких секунд. Поскольку этот метод немедленно возвращается, массив scores
еще не был заполнен из обратного вызова, и поэтому он пуст.
По сути, вы пытаетесь использовать значение синхронно из асинхронного API. Это не очень хорошая идея. Вы должны обрабатывать API-интерфейсы асинхронно, как и предполагалось.
Быстрое решение этой проблемы - переместить следующие строки кода:
for (int i = 0; i < 10; ++i) {
scores[i] = i;
}
int i = scores[3];
Внутри метода onChildAdded()
, где доступны данные.
Если вам нужно зациклить ваш массив score
за пределами обратного вызова, я рекомендую вам посмотреть последнюю часть моего ответа из этого поста , в котором я объяснил, как он может быть сделано с помощью пользовательского обратного вызова. Вы также можете взглянуть на это видео для лучшего понимания.