Проблемы с использованием Firebase ChildEventListener - PullRequest
0 голосов
/ 08 мая 2018

Я пытался извлечь информацию из базы данных Firebase Realtime в свое настольное Java-приложение, и меня смущает, как работает ChildeventListener;

public void getInformation(){
    DatabaseReference ref = FirebaseDatabase.getInstance()
    .getReference().child("Users/Informatique/LFI1");
    Query myq = ref.orderByChild("Presences");
    myq.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot snapshot, String previousChildName) {

            Map <String, String> map = new HashMap <String, String>();
            map = (Map<String, String>) snapshot.child("Presences").getValue();


            for(Map.Entry<String,String> entry : map.entrySet()){

               System.out.println(entry.getValue());
               list.add(entry.getValue());

            }

         }


     });
     System.out.println(list.size());
}  

Значения, которые я получаю в выводе, - это то, что мне нужно, но размер списка, в конце концов, 0, и его нельзя использовать где-либо еще, если вы проверите размер внутри метода onChildAdded, вы получите правильный.

0
< 12345678 Skander Maranissi LFI1 Wed May 02 15:52:03 GMT+01:00 2018 >
< 12345678 Mohsen Yajour LFI1 Wed May 02 15:09:32 GMT+01:00 2018 >
< 12345678 Lebron James LFI1 Wed May 02 16:51:35 GMT+01:00 2018 >
< 12345678 Lebron James LFI1 Sat May 05 12:54:02 GMT+01:00 2018 >

Как распечатывается размер списка, затем проходит по карте; это то, что не ясно в моей голове о том, как работают слушатели. Большое спасибо.

1 Ответ

0 голосов
/ 08 мая 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...