Androidアプリケーションのデータを格納および取得するためにFirebase Realtime Databaseを使用しています。私のアクティビティでは、childEventListener
を使用してFirebaseからすべてのデータ(例:ユーザーデータのリスト) 。
データがデータベースから完全に取得されていない限り、進行状況バーを表示したいと思います。データがロードされた後にプログレスバーを閉じることができるように、すべてのデータが完全に取得されたかどうかを確認するにはどうすればよいですか?
Firebaseが特定の場所でinitialデータの同期を完了したことを検出する一般的な方法があります。このアプローチでは、 Firebaseイベントの保証 のいずれかを使用します。
値イベントは常に最後にトリガーされ、そのスナップショットが取得される前に発生した他のイベントからの更新が含まれることが保証されます。
したがって、特定の場所に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()
イベントを使用してプログレスバーを非表示にできます。
ただし、覚えておくべきことが1つあります。Firebaseはloadデータだけではありません。サーバーから接続されているすべてのクライアントにデータを継続的にsynchronizesします。そのため、データが完全に取得される瞬間はありません。
私は非常に簡単な方法でそれをしました。 intをカウントし、関数内に来るたびにインクリメントし、子の総数に等しいかどうかをチェックします。等しい場合は、進行状況バーを停止できます
int count = 0;
ref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
count++;
if(count >= dataSnapshot.getChildrenCount()){
//stop progress bar here
}
}