查看 Firebase 上的 childEventListener 是否已完成加载所有数据
Find out if childEventListener on Firebase has completed loading all data
我正在使用 Firebase 实时数据库为我的 Android 应用程序存储和检索数据。在我的 activity 中,我使用 childEventListener
.
从 Firebase 检索所有数据(例如:用户数据列表)
只要数据没有完全从数据库中检索出来,我就想显示一个进度条。如何检查是否所有数据都已完全检索,以便在数据加载后关闭进度条?
有一种常见的方法可以检测 Firebase 何时完成给定位置上初始 数据的同步。这种方法利用了 Firebase event guarantees:
之一
Value events are always triggered last and are guaranteed to contain updates from any other events which occurred before that snapshot was taken.
因此,如果您在给定位置同时拥有 ValueEventListener
和 ChildEventListener
,则 ValueEventListener.onDataChange()
肯定会在 after 之后被调用所有 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 不只是 加载 数据。它不断地同步 数据从服务器到所有连接的客户端。因此,实际上没有任何时刻 完全 检索到数据。
我已经用很简单的方法完成了。我让一个 int 计数,然后每次当它进入函数时,我都会递增它并检查它是否等于 childs 的总数。如果相等那么你可以停止进度条
int count = 0;
ref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
count++;
if(count >= dataSnapshot.getChildrenCount()){
//stop progress bar here
}
}
使用
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) {
}
});
我正在使用 Firebase 实时数据库为我的 Android 应用程序存储和检索数据。在我的 activity 中,我使用 childEventListener
.
只要数据没有完全从数据库中检索出来,我就想显示一个进度条。如何检查是否所有数据都已完全检索,以便在数据加载后关闭进度条?
有一种常见的方法可以检测 Firebase 何时完成给定位置上初始 数据的同步。这种方法利用了 Firebase event guarantees:
之一Value events are always triggered last and are guaranteed to contain updates from any other events which occurred before that snapshot was taken.
因此,如果您在给定位置同时拥有 ValueEventListener
和 ChildEventListener
,则 ValueEventListener.onDataChange()
肯定会在 after 之后被调用所有 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 不只是 加载 数据。它不断地同步 数据从服务器到所有连接的客户端。因此,实际上没有任何时刻 完全 检索到数据。
我已经用很简单的方法完成了。我让一个 int 计数,然后每次当它进入函数时,我都会递增它并检查它是否等于 childs 的总数。如果相等那么你可以停止进度条
int count = 0;
ref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
count++;
if(count >= dataSnapshot.getChildrenCount()){
//stop progress bar here
}
}
使用
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) {
}
});