Подтвердить что ты не робот

Узнайте, завершил ли childEventListener Firebase загрузку всех данных

Я использую базу данных Firebase Realtime для хранения и получения данных для моего приложения для Android. В своей деятельности я извлекаю все данные (пример: список пользовательских данных) из Firebase с помощью childEventListener.

Я хочу показать индикатор выполнения, пока данные не будут полностью извлечены из базы данных. Как проверить, полностью ли получены все данные, чтобы я мог закрыть индикатор выполнения после загрузки данных?

4b9b3361

Ответ 1

Существует общий способ обнаружения, когда Firebase выполняется синхронизация исходных данных в определенном месте. Этот подход использует один из Firebase event:

События события всегда запускаются последними и гарантированно содержат обновления от любых других событий, которые произошли до того, как был сделан снимок.

Итак, если у вас есть как ValueEventListener, так и ChildEventListener в определенном месте, ValueEventListener.onDataChange() гарантированно будет вызван после того, как все вызовы 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 не просто загружает данные. Он непрерывно синхронизирует данные с сервера всем подключенным клиентам. Таким образом, на самом деле нет моментального момента, когда данные будут полностью восстановлены.

Ответ 2

Я сделал это довольно просто. Я позволяю int count, а затем каждый раз, когда он входит внутрь функции, я увеличиваю ее и проверяю, равно ли она полному числу дочерних элементов. если он равен, то вы можете остановить индикатор выполнения

    int count = 0;    
    ref.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            count++;


            if(count >= dataSnapshot.getChildrenCount()){
                //stop progress bar here
            }
        }