【发布时间】:2017-02-19 13:35:29
【问题描述】:
我的应用正在使用 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 事件。"
我认为这将解决数据加载问题,但我以前版本的应用程序仍将继续使用实时连接,并且在超过 150 个的新版本应用程序中,我仍然看到数据加载调用随机成功和失败+ 用户现在使用旧版本的应用程序。如果旧版app打开超过100个连接,新版app尝试加载数据会怎样?即,如果使用免费计划中的 100 个连接,将使用
进行查询imagesQuery.addListenerForSingleValueEvent(valueEventListener);
成功还是失败?
【问题讨论】:
-
图片文件有什么限制?例如用于读写
-
我只是存储图片网址
标签: android firebase firebase-realtime-database