Запрос данных от 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 до того, как я верну этот список, поэтому мой вопрос … как я могу заставить этот метод возвращать список элементов от БД?
- Bitmap возвращает null из BitmapFactory.decodeFile (имя файла)
- Android - создание CSV-файла из значений таблицы
- «Android-обновление sdk» на безголовом Linux
- Android open ContextMenu на коротком клике + элемент с кликом
- Переход 3D-куба в Android
- Android Home Screen Widget (значок, стиль ярлыка)
- Как удалить уведомление после того, как действие было нажато
- Как создать диаграмму classов (UML) в Android Studio (IntelliJ Idea)
- Добавить прописку на вид программно
- Читать все телефонные номера контактов в android
- Отключить анимацию анимации активности при запуске новой активности?
- Как добавить переключатель в панель действий Android?
- Как добавить библиотеку (android-support-v7-appcompat) в IntelliJ IDEA
Когда вы вызываете 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
- это сообщение в блоге от Дуга Стивенсона