web-dev-qa-db-ja.com

FirebaseのchildEventListenerがすべてのデータの読み込みを完了したかどうかを確認します

Androidアプリケーションのデータを格納および取得するためにFirebase Realtime Databaseを使用しています。私のアクティビティでは、childEventListenerを使用してFirebaseからすべてのデータ(例:ユーザーデータのリスト) 。

データがデータベースから完全に取得されていない限り、進行状況バーを表示したいと思います。データがロードされた後にプログレスバーを閉じることができるように、すべてのデータが完全に取得されたかどうかを確認するにはどうすればよいですか?

42
Stanley Giovany

Firebaseが特定の場所でinitialデータの同期を完了したことを検出する一般的な方法があります。このアプローチでは、 Firebaseイベントの保証 のいずれかを使用します。

値イベントは常に最後にトリガーされ、そのスナップショットが取得される前に発生した他のイベントからの更新が含まれることが保証されます。

したがって、特定の場所にValueEventListenerChildEventListenerの両方がある場合、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します。そのため、データが完全に取得される瞬間はありません。

84

私は非常に簡単な方法でそれをしました。 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
            }
        }
10
osama