【问题标题】:Does Firebase ValueEventListener call succeeds when there are more than 100 live connection in free plan?当免费计划中有超过 100 个实时连接时,Firebase ValueEventListener 调用是否成功?
【发布时间】: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


【解决方案1】:

当 Android 应用首次使用 Firebase 数据库 SDK 时,它会连接到 Firebase 服务器。如果此时已经有与数据库允许的连接数一样多,则新连接将被拒绝。听众的类型对此没有影响。

关于已经讨论过的很多内容,请参阅this list。一些不错的:

【讨论】:

  • 接受了付费计划:D
【解决方案2】:

查看了您的代码。我建议在从 json 读取图像完成后插入关闭连接。免费包中存在连接限制,因此一旦他们阅读图像,他们在技术上仍然是连接的。

查看您的 Datasnapshot,他们什么也没做,但仍在查询 Firebase。我也建议研究索引。

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

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

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 2021-05-05
    • 1970-01-01
    • 2020-06-30
    • 2019-06-19
    相关资源
    最近更新 更多