我使用Firebase实时数据库存储和检索Android应用程序的数据。在我的活动中,我使用childEventListener
从Firebase检索所有数据(例如:用户数据列表)。
只要未从数据库中完整检索数据,我想显示进度条。如何检查是否已完全检索所有数据,以便在加载数据后关闭进度条?
答案 0 :(得分:83)
有一种常用方法可以检测Firebase何时完成同步给定位置上的初始数据。这种方法使用了Firebase event guarantees之一:
值事件总是最后触发,并且保证包含在拍摄快照之前发生的任何其他事件的更新。
因此,如果您在指定位置同时拥有ValueEventListener
和ChildEventListener
,则ValueEventListener.onDataChange()
保证在所有{{1}之后被称为调用已经发生了。您可以使用它来了解何时完成初始数据加载:
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
事件隐藏进度条。
但有一点要记住:Firebase不仅仅是加载数据。它不断将数据从服务器同步到所有连接的客户端。因此,实际上没有任何时候完全检索数据。
答案 1 :(得分:10)
我以非常简单的方式完成了它。我让int计数然后每当它进入函数内部时,我增加它并检查它是否等于孩子的总数。如果它相等,那么你可以停止进度条
AVSpeechSynthesizerDelegate
答案 2 :(得分:0)
使用
totalChilds = 0;
ref..addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
totalChilds = dataSnapshot.getChildrenCount();
ref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
count++;
if(count >= totalChilds){
progressDialog.dismiss();
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});