查看 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.

因此,如果您在给定位置同时拥有 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() 事件来隐藏进度条。

但要记住一件事: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) {

                }
            });