Intereting Posts
Android использует NTP для синхронизации времени? Android-браузер по умолчанию не прокручивает веб-страницу Android – мягкая клавиатура выталкивает макет моей активности из экрана Заменить (или «переопределить») строку в проекте библиотеки Android Как установить разделитель между вкладками в TabLayout библиотеки поддержки дизайна? Отрицание в состоянии при отправке сообщения FCM После поворота экрана язык моего приложения будет изменен Android: «BadTokenException: невозможно добавить окно; Ваша активность работает? »При отображении диалога в PreferenceActivity Использование намерения использовать камеру на Android Android сразу же создал элементы пары Android Facebook.authorize не вызывает метод oncomplete Как использовать совместное использование совместного использования изображений для совместного использования изображений в Android? Время соединения Android BLE Не может разрешить AppCompatActivity AppCompat 23.3 Поддержка векторов больше не работает?

Узнать, прослушивает ли дочерний прослушиватель событий на Firebase все данные

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

Моя проблема:

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

Любой ответ был бы оценен, спасибо!

Solutions Collecting From Web of "Узнать, прослушивает ли дочерний прослушиватель событий на Firebase все данные"

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

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

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

Я сделал это довольно просто. Я допускаю 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 } }