我正在使用Firebase实时数据库来存储和检索Android应用程序的数据。在我的 Activity 中,我使用childEventListener
从Firebase检索所有数据(例如:用户数据列表)。
我想显示一个进度条,只要数据没有从数据库中完全检索出来即可。如何检查是否完全检索了所有数据,以便在加载数据后可以关闭进度栏?
最佳答案
有一种通用的方法可以检测Firebase何时完成了在给定位置上的初始数据同步。这种方法利用了Firebase event guarantees之一:
因此,如果在给定位置上同时具有ValueEventListener
和ChildEventListener
,则可以保证在所有ValueEventListener.onDataChange()
调用均发生后才调用onChildAdded()
。您可以使用它来了解何时完成初始数据加载:
ref.addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println("We're done loading the initial "+dataSnapshot.getChildrenCount()+" items");
}
public void onCancelled(FirebaseError firebaseError) { }
});
ref.addChildEventListener(new ChildEventListener() {
public void onChildAdded(DataSnapshot dataSnapshot, String previousKey) {
System.out.println("Add "+dataSnapshot.getKey()+" to UI after "+previousKey);
}
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
public void onCancelled(FirebaseError firebaseError) { }
});
在我的测试运行中,结果如下:
Add -K2WLjgH0es40OGWp6Ln to UI after null
Add -K2YyDkM4lUotI12OnOs to UI after -K2WLjgH0es40OGWp6Ln
Add -K2YyG4ScQMuRDoFogA9 to UI after -K2YyDkM4lUotI12OnOs
...
Add -K4BPqs_cdj5SwARoluP to UI after -K4A0zkyITWOrxI9-2On
Add -K4BaozoJDUsDP_X2sUu to UI after -K4BPqs_cdj5SwARoluP
Add -K4uCQDYR0k05Xqyj6jI to UI after -K4BaozoJDUsDP_X2sUu
We're done loading the initial 121 items
因此,您可以使用
onDataChanged()
事件隐藏进度栏。但是要记住一件事:Firebase不仅加载数据。它不断地将服务器中的数据同步到所有连接的客户端。这样,实际上几乎没有任何时刻可以完全检索到数据。
关于android - 查明Firebase上的childEventListener是否已完成加载所有数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34530566/