我一直在尝试从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 >
如何打印列表的大小然后循环遍历地图;对于听众的工作方式,我不清楚这一点。非常感谢。
答案 0 :(得分:0)
您现在无法获得尚未加载的列表大小。换句话说,您不能简单地在list.size()
方法之外调用onChildAdded()
,因为由于此方法的异步行为,它始终为0
。这意味着当您尝试获取该方法之外的列表大小时,数据尚未从数据库中完成加载,这就是大小始终为0
的原因。快速解决此问题的方法是仅在list.size()
方法中使用onChildAdded()
,或者如果您想在外面使用它,我建议您从 {{看到我的anwser的最后一部分3}} 我已经开始使用自定义回调来完成它的完成。您还可以查看此 post 以获得更好的理解。请注意,onDataChange()
方法与onChildAdded()
方法具有相同的行为。