Запрос данных от firebase

Я пытаюсь получить список элементов из базы данных firebase … но у меня есть проблема с их получением. Мой код выглядит примерно так:

List itemsList; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_work_items_report); itemsList = GetItems(); } 

и метод, который должен вернуть мои объекты, выглядит так:

 private ArrayList GetItems(){ DatabaseReference database = FirebaseDatabase.getInstance().getReference(); DatabaseReference ref = database.child("items"); final ArrayList itemsRez = new ArrayList(); Query itemsQuery = ref.orderByChild("type"); itemsQuery.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if (dataSnapshot.exists()) { for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) { Items item = singleSnapshot.getValue(Items.class); itemsRez.add(item); } } } @Override public void onCancelled(DatabaseError databaseError) { } }); return itemsRez; } 

GetItems () всегда возвращает мне нулевой список, который имеет смысл, поскольку нечего запускать событие onDataChange до того, как я верну этот список, поэтому мой вопрос … как я могу заставить этот метод возвращать список элементов от БД?

Когда вы вызываете addListenerForSingleValueEvent() клиент Firebase начинает загрузку данных с сервера, что может занять некоторое время. Чтобы предотвратить блокирование вашего приложения (что приведет к диалогу приложения не реагирует), он загружает данные в отдельный stream. Поэтому, пока данные загружаются, основной stream продолжается и возвращает текущее состояние itemsRez , которое представляет собой пустой список.

Проще всего это увидеть, если добавить в код несколько операторов регистрации:

 private ArrayList GetItems(){ DatabaseReference database = FirebaseDatabase.getInstance().getReference(); DatabaseReference ref = database.child("items"); final ArrayList itemsRez = new ArrayList(); Query itemsQuery = ref.orderByChild("type"); System.out.println("Attaching listener"); itemsQuery.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if (dataSnapshot.exists()) { for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) { Items item = singleSnapshot.getValue(Items.class); itemsRez.add(item); } } System.out.println("Received "+itemsRez.size()+" items"); } @Override public void onCancelled(DatabaseError databaseError) { } }); System.out.println("Returning "+itemsRez.size()+" items"); return itemsRez; } 

Вопреки тому, что вы, скорее всего, ожидаете, это будет печатать журнал в следующем порядке:

Прикрепление слушателя

Возврат 0 пунктов

Полученные изделия

Одно общее решение вашей проблемы – пересмотреть цель вашего кода. Вместо того, чтобы писать «сначала получить элементы, а затем выполнить abc с ними», напишите код как «начать получать элементы, а затем, когда они войдут, сделайте abc с ними». В коде, который означает, что вы перемещаете код, который требует itemsRec в метод onDataChange , где он будет вызываться в нужный момент: когда элементы загружены.

Также см:

  • Установка значения свойства Singleton в Firebase Listener
  • Firebase / Android: добавление извлеченных значений из Firebase в arraylist возвращает исключение из null-указателя
  • Wait Firebase async извлекает данные в android
  • это сообщение в блоге от Дуга Стивенсона
  • Экспорт и запуск проекта Unity3D в Android Studio
  • Ошибка эмулятора: в конфигурации AVD отсутствует файл ядра
  • Как показать маркер в Картах, запущенных Geo Uri Intent?
  • Как начать работу в адаптере?
  • Listview itemclick не работает
  • Как установитьContentView в fragmentе?
  • Как создать банку для проекта библиотеки Android
  • Могу ли я последовательно переключать асинхронную задачу (начиная с одной после завершения предыдущей асинтезы)
  • IOException: сбой чтения, сокет может быть закрыт - Bluetooth на Android 4.3
  • Доступ к SharedPreferences с помощью статических методов
  • Android Studio TransformException: ошибка: выполнение не выполнено для задачи ': app: transformClassesWithDexForDebug'
  • Давайте будем гением компьютера.