我的应用正在使用Firebase,并且在给定时间内有近200名用户。大多数用户抱怨数据无法加载。我使用ChildEventListener来获取保持连接活动并反映实时更改的数据。免费计划中限制为100个连接。我猜这就是我的数据有时无法加载的原因。在阅读文档后,我发现了另一种使用ValueEventListener读取数据的方法。以下是我目前正在使用的代码
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 events。“
我认为这将解决数据加载问题,但我以前的应用版本仍将继续使用实时连接,我仍然看到随着数据加载调用的随机成功和失败,新版本的应用程序超过150 +用户现在使用旧版本的应用程序。如果旧版本的应用程序打开超过100个连接并且新版本的应用程序尝试加载数据,会发生什么?即如果使用免费计划中的100个连接将使用
进行查询imagesQuery.addListenerForSingleValueEvent(valueEventListener);
成功还是失败?
答案 0 :(得分:1)
看了你的代码。我建议在完成从json读取图像后插入关闭连接。在免费套餐中,存在连接限制,因此一旦他们阅读图像,它们在技术上仍然是连接的。
查看您的Datasnapshot,他们除了仍在查询Firebase之外什么都不做。我也建议你看一下索引。
https://firebase.google.com/docs/database/rest/save-data
https://firebase.google.com/docs/database/security/indexing-data
答案 1 :(得分:1)
当Android应用首次使用Firebase数据库SDK时,它会与Firebase服务器建立连接。如果此时已存在与数据库允许的连接数,则将拒绝新连接。听众的类型对此没有影响。
有很多关于此问题的讨论,请参阅this list。一些好的: