2017-02-19 15 views
2

Мое приложение использует Firebase, и в данный момент в нем задействовано почти 200 пользователей. Большинство пользователей жалуются, что данные не загружаются. Я использовал ChildEventListener для получения данных, которые поддерживают соединение и отображают живые изменения. В свободном плане есть ограничение на 100 соединений. Думаю, именно по этой причине мои данные не загружаются время от времени. После прочтения документа я нашел другой способ чтения данных с помощью ValueEventListener. Ниже приведен код, который я сейчас используюВыполняется ли вызов Firebase ValueEventListener, когда в свободном плане существует более 100 прямых соединений?

 public void getImages() { 
     Query imagesQuery = FirebaseDatabase.getInstance().getReference().child("englishDps").child(mChildName).orderByKey().limitToLast(21); 

     ChildEventListener childEventListener = new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       Image image = dataSnapshot.getValue(Image.class); 
       image.setNodeKey(dataSnapshot.getKey()); 

       mTempImages.add(image); 
       if (mTempImages.size() == 21) { 
        mLastKey = mTempImages.get(0).getNodeKey(); 
        Collections.reverse(mTempImages); 
        mTempImages.remove(mTempImages.size() - 1); 
        mImages.addAll(mTempImages); 
        setAdapter(); 
       } 
      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 

      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       if (isAdded()) { 
        Toast.makeText(getActivity(), "Problem loading more images...", Toast.LENGTH_LONG).show(); 
       } 
      } 
     }; 

     ValueEventListener valueEventListener = new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       for(DataSnapshot imageSnapshot : dataSnapshot.getChildren()) 
       { 
        Image image = imageSnapshot.getValue(Image.class); 
        image.setNodeKey(imageSnapshot.getKey()); 

        mTempImages.add(image); 
        if (mTempImages.size() == 21) { 
         mLastKey = mTempImages.get(0).getNodeKey(); 
         Collections.reverse(mTempImages); 
         mTempImages.remove(mTempImages.size() - 1); 
         mImages.addAll(mTempImages); 
         setAdapter(); 
        } 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }; 

//  imagesQuery.addChildEventListener(childEventListener); 
//  imagesQuery.addValueEventListener(valueEventListener); 
     imagesQuery.addListenerForSingleValueEvent(valueEventListener); 
    } 

Согласно документации

«В то время как с помощью ChildEventListener это рекомендуемый способ читать списки данных, есть ситуации, когда прикрепление ValueEventListener к ссылки список полезен.

Прикрепление ValueEventListener к списку данных будет возвращать весь перечень данных в виде единого DataSnapshot, который вы можете затем цикл для доступа к отдельным детям.

Даже если для запроса имеется только одно совпадение, моментальный снимок равен . он просто содержит один элемент. Чтобы получить доступ к элементу, вам необходимо зацикливать результат :.

Этот шаблон может быть полезен, если вы хотите получить всех детей из списка за одну операцию, вместо того чтобы слушать дополнительные onChildAdded события. "

Я думал, что это решит проблему загрузки данных, но мою предыдущую версию приложения все еще будет продолжать использовать живую связь, и я до сих пор вижу случайный успех и неудачи для вызова загрузки данных в новой версии приложение, в котором более 150 пользователей живут прямо сейчас на старой версии приложения. Что произойдет, если старая версия приложения откроет более 100 соединений, а новая версия приложения попытается загрузить данные? То есть, если 100 подключений в свободный план используется будет запрос с

imagesQuery.addListenerForSingleValueEvent(valueEventListener); 

успеха или неудачи?

+0

какие ограничения файла изображения? например для чтения и записи – user7568042

+0

Я просто храню образы изображения –

ответ

1

Когда Android приложение первый использует Firebase Database SDK, он делает подключение к Firebase серверов. Если в тот момент уже установлено столько соединений, которые разрешены для вашей базы данных, новое соединение будет отклонено. Тип слушателя не влияет на это.

За много обсуждений, охватывающих это уже, см. .Некоторые хорошие:

+0

Принимал оплаченный план: D –

1

Посмотрев на свой код. Я рекомендую вставлять закрывающее соединение после завершения чтения изображений из json. В бесплатном пакете существует ограничение на соединения, поэтому, когда они читают изображения, они технически все еще подключены.

Глядя на ваш Datasnapshot, они ничего не делают, но все еще обращаются к Firebase. Я также рекомендую также изучить индексацию.

https://firebase.google.com/docs/database/rest/save-data

https://firebase.google.com/docs/database/security/indexing-data