Firebase не может сохранить полученные данные в ArrayList

Получение данных работает, но я не могу сохранить полученные данные в 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;

}

это происходит из-за того, что addListenerForSingleValueEvent является асинхронным.

Kuldeep mourya 29.05.2018 04:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
924
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете сейчас вернуть то, что еще не было загружено. Другими словами, вы не можете просто вернуть список profiles вне метода onDataChange(), потому что он всегда будет empty из-за асинхронного поведения этого метода. Это означает, что к тому времени, когда вы пытаетесь вернуть этот результат за пределами этого метода, данные еще не завершили загрузку из базы данных и поэтому недоступны.

Быстрое решение этой проблемы - использовать список profiles только внутри метода onDataChange(), в противном случае я рекомендую вам просмотреть последнюю часть моего ответа из этого Почта, в котором я объяснил, как это можно сделать с помощью настраиваемого обратного вызова. Вы также можете взглянуть на этот видео для лучшего понимания.

Редактировать: 26 февраля 2021 г.

Для получения дополнительной информации вы можете проверить следующую статью:

И следующее видео:

Да, я решил проблему, выполнив все необходимое с данными внутри "onDataChange ()", спасибо.

Fake 31.05.2018 04:48

Другие вопросы по теме