找出Firebase上的childEventListener是否已完成加载所有数据

时间:2015-12-30 13:32:40

标签: android firebase firebase-realtime-database

我使用Firebase实时数据库存储和检索Android应用程序的数据。在我的活动中,我使用childEventListener从Firebase检索所有数据(例如:用户数据列表)。

只要未从数据库中完整检索数据,我想显示进度条。如何检查是否已完全检索所有数据,以便在加载数据后关闭进度条?

3 个答案:

答案 0 :(得分:83)

有一种常用方法可以检测Firebase何时完成同步给定位置上的初始数据。这种方法使用了Firebase event guarantees之一:

  

值事件总是最后触发,并且保证包含在拍摄快照之前发生的任何其他事件的更新。

因此,如果您在指定位置同时拥有ValueEventListenerChildEventListener,则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) {

                }
            });