Получение данных работает, но я не могу сохранить полученные данные в ArrayList. Сразу после метода «onDataChanged ()» ArrayList «profile», кажется, имеет 2 значения, но в операторе возврата он имеет 0.
static List<Profile> profiles = new ArrayList<Profile>();
static DatabaseReference dbr;
public static List<Profile> loadProfiles(Context context){
dbr = FirebaseDatabase.getInstance().getReference().child("users").child("hiring");
dbr.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// This method is called once with the initial value and again
// whenever data at this location is updated.
//String value = dataSnapshot.getValue(String.class);
//Log.d("hello", "Value is: " + value);
List<Profile> profiles2 = new ArrayList<>();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
Profile profile = snapshot.getValue(Profile.class);
//Log.d("hello", profile.getCompanyName());
profiles2.add(profile);
}
profiles = profiles2;
dbr.removeEventListener(this);
}
@Override
public void onCancelled(DatabaseError error) {
// Failed to read value
Log.w("hello", "Failed to read value.", error.toException());
}
});
return profiles;
}




Вы не можете сейчас вернуть то, что еще не было загружено. Другими словами, вы не можете просто вернуть список profiles вне метода onDataChange(), потому что он всегда будет empty из-за асинхронного поведения этого метода. Это означает, что к тому времени, когда вы пытаетесь вернуть этот результат за пределами этого метода, данные еще не завершили загрузку из базы данных и поэтому недоступны.
Быстрое решение этой проблемы - использовать список profiles только внутри метода onDataChange(), в противном случае я рекомендую вам просмотреть последнюю часть моего ответа из этого Почта, в котором я объяснил, как это можно сделать с помощью настраиваемого обратного вызова. Вы также можете взглянуть на этот видео для лучшего понимания.
Редактировать: 26 февраля 2021 г.
Для получения дополнительной информации вы можете проверить следующую статью:
И следующее видео:
Да, я решил проблему, выполнив все необходимое с данными внутри "onDataChange ()", спасибо.
это происходит из-за того, что addListenerForSingleValueEvent является асинхронным.