当免费计划中有超过100个实时连接时,Firebase ValueEventListener调用是否成功?

时间:2017-02-19 13:35:30

标签: android firebase firebase-realtime-database

我的应用正在使用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);

成功还是失败?

2 个答案:

答案 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。一些好的: