Android: Firebase требует слишком много времени для получения данных

Я использую функцию базы данных Firebase в реальном времени в своем приложении. База данных выглядит так: привязка базы данных

Узлы 104, 1040... имеют дополнительные элементы/данные. Я извлекаю эти данные, упорядочивая их по значению в узле «updatedAt», доступном в каждом родительском элементе Integer, как показано на снимке. Я использую onChildAddedListener() для получения последних 20 элементов. В «результатах» около 1050 узлов.

Проблема:

  1. Извлечение данных занимает слишком много времени, около 30 секунд, даже при высокоскоростном Wi-Fi.

  2. Разрешает ли Firebase какой-либо обратный вызов для уведомления о том, что данные были получены? Я хочу добавить каждый пользовательский объект в ArrayList, полученный от Firebase, и передать его через намерение другому действию. Я считаю полученные объекты, и когда их становится 20, я открываю свою активность. Это единственный способ сделать это? Если есть лучший выход, предлагайте.

Вот мой код:

 public class Splash extends AppCompatActivity{

        private static final String TAG = "Splash Activity";
        private ArrayList<News> NewsArrayList = new ArrayList<>();   
        private DatabaseReference newsReference;
        private int position = 0;

        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_splash);

            newsReference = FirebaseDatabase.getInstance().getReference().child("results");
            Query queryNewsReference = newsReference.orderByChild("updatedAt").limitToLast(20);
            fetchNews(queryNewsReference);
        }

        private void fetchNews(Query queryNewsReference) {

            queryNewsReference.addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                    Log.d(TAG, "onChildAdded:" + dataSnapshot.getKey());
                    News newsObject = dataSnapshot.getValue(News.class);
                    Log.d(TAG,"News Title: "+ newsObject.getVideo_title());
                    NewsArrayList.add(newsObject);
                    position++;
                    if(position == 20){
                    startMainActivity(); 
                    }
                }
                @Override
                public void onChildChanged(DataSnapshot dataSnapshot, String s){
                    Log.d(TAG, "onChildChanged() called on key: "+ dataSnapshot.getKey());
                }

                @Override
                public void onChildRemoved(DataSnapshot dataSnapshot) {
                    Log.d(TAG, "onChildRemoved() called on key: "+ dataSnapshot.getKey());
                }

                @Override
                public void onChildMoved(DataSnapshot dataSnapshot, String s) {
                    Log.d(TAG, "onChildMoved() called on key: "+ dataSnapshot.getKey());
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    Log.e(TAG,"Database Error: "+databaseError.toString());
                }
            });
        }

        private void startMainActivity() {
            Intent intent = new Intent(Splash.this,MainActivity.class);
            intent.putExtra("NewsList",NewsArrayList);
            Splash.this.startActivity(intent);
        }

person brainbreaker    schedule 08.06.2016    source источник
comment
Происходит ли 30-секундная задержка перед тем, как вы увидите первое сообщение logcat onChildAdded? Как только вы видите первый onChildAdded, остальные сразу же следуют за ним?   -  person Bob Snyder    schedule 08.06.2016
comment
@qbix Да. 30-секундная задержка до того, как я увижу первое «onChildAdded». Кстати в чем разница? Если вызывается onChildAdded(), это означает, что данные получены, верно?   -  person brainbreaker    schedule 08.06.2016
comment
Просто ищу подсказки. FWIW Я создал тестовый пример, очень похожий на ваш (1100 объектов, заказанных ребенком, ограниченных последними 20) и не вижу задержек. Я в Калифорнии, возможно, у меня лучше связь с серверами, чем у тебя.   -  person Bob Snyder    schedule 08.06.2016
comment
@qbix: понятно. Кроме этого, о моем втором пункте в вопросе. Это правильный способ сделать? Или, если есть лучший способ, предложите.   -  person brainbreaker    schedule 08.06.2016
comment
@Frank van Puffelen Будучи инженером в Firebase, было бы здорово, если бы вы могли поделиться своими мыслями. Спасибо!   -  person brainbreaker    schedule 09.06.2016
comment
Я также сталкиваюсь с проблемой на низком слабом устройстве   -  person YTerle    schedule 31.01.2017


Ответы (1)


Попробуйте переподключиться к firebase, прежде чем добавлять прослушиватель значений:

private void fetchNews(Query queryNewsReference) 
{    
    if (FirebaseDatabase.getInstance() != null)
    {
        FirebaseDatabase.getInstance().goOffline();
    }

    FirebaseDatabase.getInstance().goOnline();

    queryNewsReference.addChildEventListener(new ChildEventListener() {

    ...
}
person Ashwin    schedule 21.12.2016