使用Firebase ChildEventListener的问题

时间:2018-05-07 22:25:33

标签: java firebase firebase-realtime-database

我一直在尝试从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 :(得分:0)

您现在无法获得尚未加载的列表大小。换句话说,您不能简单地在list.size()方法之外调用onChildAdded(),因为由于此方法的异步行为,它始终为0。这意味着当您尝试获取该方法之外的列表大小时,数据尚未从数据库中完成加载,这就是大小始终为0的原因。快速解决此问题的方法是仅在list.size()方法中使用onChildAdded(),或者如果您想在外面使用它,我建议您从 {{看到我的anwser的最后一部分3}} 我已经开始使用自定义回调来完成它的完成。您还可以查看此 post 以获得更好的理解。请注意,onDataChange()方法与onChildAdded()方法具有相同的行为。