Данные загружаются из Firebase асинхронно. Ваш основной код продолжает выполняться во время загрузки данных, а затем, когда данные становятся доступны, вызывается метод onDataChange
. Что это означает, легче всего увидеть, если добавить несколько операторов журнала:
Log.d("TAG", "Before attaching listener");
mRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
Log.d("TAG", "Got data");
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
});
Log.d("TAG", "After attaching listener");
Когда вы запускаете этот код, он записывает:
Перед подключением слушателя
После подключения слушателя
Получил данные
Вероятно, это не тот порядок, который вы ожидали, но он совершенно нормален при вызове асинхронных API. И это объясняет, почему вы получите неправильное значение, если напечатаете его за пределами onDataChange()
.
Проблема не в том, что вы не можете использовать данные вне onDataChange()
, проблема в том, что вы должны убедиться, что onDataChange()
запустил до того, как вы используете данные.
Самый простой способ сделать это - поместить весь код, требующий данных из базы данных , в метод onDataChange
. Но вы также можете создать свой собственный интерфейс обратного вызова и передать его в метод, в который вы загружаете данные. Пример обоих этих подходов см. В моем ответе здесь: Метод getContactsFromFirebase () возвращает пустой список