Мое приложение использует 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);
успеха или неудачи?
какие ограничения файла изображения? например для чтения и записи – user7568042
Я просто храню образы изображения –