实施具有多对多关系的 Android Firebase应用:用户< - >窗口小部件(窗口小部件可以共享给多个用户).

注意事项:

>列出用户拥有的所有小部件.
>用户只能看到与他/她共享的小部件.
>能够看到共享给定Widget的所有用户.
>单个Widget可由具有相同权限的多个用户拥有/管理(修改Widget并更改为共享对象).与Google云端硬盘与特定用户共享的方式类似.

实现获取(join-style)的方法之一是使用这个建议:https://www.firebase.com/docs/android/guide/structuring-data.html(“加入扁平化数据”):

// fetch a list of Mary's groups
ref.child("users/mchen/groups").addChildEventListener(new ChildEventListener() {
  @Override
  public void onChildAdded(DataSnapshot snapshot,String prevIoUsChildKey) {
    // for each group,fetch the name and print it
    String groupKey = snapshot.getKey();
    ref.child("groups/" + groupKey + "/name").addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot snapshot) {
        System.out.println("Mary is a member of this group: " + snapshot.getValue());
      }
      @Override
      public void onCancelled(FirebaseError firebaseError) {
        // ignore
      }
    });
  }
});

这引发了一个问题,即是否有许多听众会对性能产生负面影响,或者可能会达到一些硬限制.

但我们在文档中得到了保证:

Is it really okay to look up each record individually? Yes. The Firebase protocol uses web sockets,and the client libraries do a great deal of internal optimization of incoming and outgoing requests. Until we get into tens of thousands of records,this approach is perfectly reasonable. In fact,the time required to download the data (i.e. the byte count) eclipses any other concerns regarding connection overhead.

但是,可以肯定的是,我做了一个小测试应用程序,比较了两种方法:

>将多个ValueEventListener-s逐个附加到所有小部件(根据上面提到的Firebase的“结构化数据”指南)
>将单个ChildEventListener附加到托管所有窗口小部件的节点(需要在一个节点下充分构建用户窗口小部件)

测试了4种不同的设备和Android版本(4.x – 5.x). Firebase lib:’com.firebase:firebase-client-android:2.3.1′.
在第一种方法中,表现相当令人失望.
我一直看到~15-100个事件/秒.最低的性能,大约15个事件/ s经常出现,所以看起来应该认真对待.
在这种情况下,如果用户有100个小部件,则需要大约6秒来获取有关所有小部件的信息(例如滚动列表).这太慢了.
使用1000个小部件,通过单独的侦听器获取其信息通常需要多达40秒.方式太慢了.

在第二种方法中,我观察到200-3000个事件/秒.因此比第一种方法快15-30倍!
所以看起来像Firebase doc中的保证[…]直到我们进入成千上万的记录,这种方法完全合理[…]考虑到它的工作速度有多慢是不准确的.

鉴于这一切,我有4个相互关联的问题.

>根据自己的经验/基准,任何人都可以确认/反驳我的发现吗?有关其他平台的信息也欢迎,因为有计划在多个平台上开发此应用程序.
>出现如此显着的性能差异的原因是什么?内部数据结构可能呢?
>有没有办法在保持第一种(多听众)方法的同时提高性能?
>是否应完全抛弃多侦听器方法,转而采用Firebase Udacity教程(“userLists”节点中的https://github.com/udacity/ShoppingListPlusPlus – 其中每个用户保留购物清单信息的副本)中提供的非规范化多拷贝方法?我在另一个问题 – Firebase: structuring data via per-user copies? Risk of data corruption?中询问这种方法的含义.

任何其他提示/考虑因素欢迎.
TIA.

解决方法

“这引发了一个问题,即是否会有很多听众对性能产生负面影响,或者可能会遇到一些限制.”

Firebase实时数据库的答案与新的Cloud Firestore数据库的答案相同.

无论您拥有多少连接或拥有多少监听器,您在客户端处理的数据量都很重要.

所以如果你有100个听众,听100比特的小数据,这已经变得相当便宜但如果每个听众都在收听不断变化的数据流,那对于客户来说非常昂贵很快.

而且由于移动设备非常不同,很难知道有多少是太多.因此,如果您针对的是那些倾向于使用非常高端手机的美国用户,那么如果我们针对手机功耗较低的国家/地区定位,这将是一个不同的限制.

因此,如果您根据活动的生命周期删除它们,您可以拥有任意数量的侦听器,如here所示.

还有另一种方法,使用addListenerForSingleValueEvent.在这种情况下,不需要删除监听器.

Firebase Android:使用许多侦听器缓慢“加入”,似乎与文档相矛盾的更多相关文章

  1. 如何使用Firebase在iOS上验证用户的电子邮件地址?

    我坚持使用firebase进行电子邮件验证.我四处寻找指导但没有帮助.在用户验证他的电子邮件后,我的代码仍然打印出用户尚未验证.我还在尝试习惯firebase的语法.这是我的代码:这是我注册部分的代码:解决方法您在签名之前检查了用户电子邮件是否已经过验证.这对我有用.

  2. ios – 1天后firebase crashlytics报告中没有数据

    解决方法对于那些仍然有问题的人.检查您的podfile中是否还有pod’Firebase/Crash’.当我删除旧的Firebase崩溃报告时,我的问题已修复.

  3. ios – Swift Firebase安全无法正常工作

    正如@M_G建议的那样,我从父母和.read中取出了.write.所以我的规则现在是:我现在得到这个输出:解决方法Firebase文档错误(暂时).在Firebase控制台中,打开规则模拟器.目前没有“密码”选项,我认为这是一个错误.如果您没有使用多个身份验证或多个身份验证在您的项目中无关紧要,请不要在您的规则中使用提供程序.否则,您可以测试此规则以进行密码验证:

  4. ios – Firebase:我应该将GoogleService-Info.plist添加到.gitignore吗?

    我正在将Firebase用于我想要开源的iOS项目.我上传之前是否应该将GoogleService-Info.plist添加到.gitignore我在Github上共享项目?我知道它包含我的API密钥,客户端ID等,这可能不安全公开?

  5. ios – Firebase动态链接中的customURLScheme是什么?

    在documentation中它说要将以下行添加到我的AppDelegate.swift:根据我的理解,这应该是您在info.plist中添加的相同链接.但是,我很困惑为什么在quickstart-iosrepo他们决定将其等同于“dlscheme”.任何人都可以帮我理解这个方案究竟是什么?

  6. FIrebase iOS集成崩溃 – 由无效的GOOGLE_APP_ID引起

    我正在尝试使用Xcode构建集成Firebase来构建我的Cordova应用程序,但是我得到了这个模糊的错误,我无法理解什么是错的.我已将GoogleService-Info.plist文件放在项目目录中,但仍无法构建.这是堆栈跟踪可能是什么问题,我不知道还有什么需要展示,所以请问.解决方法出于某种原因,Xcode始终忽略位于项目根目录中的GoogleService-Info.plist,并且未将其复制到项目的Resources文件夹中.我在那里手动复制文件,然后编译应用程序并运行得很好.

  7. 使用Firebase iOS Swift将特定设备的通知推送到特定设备

    我非常感谢PushNotifications的帮助.我的应用聊天,用户可以直接向对方发送短信.但是如果没有PushNotifications,它就没有多大意义.它全部设置在Firebase上.如何将推送通知从特定设备发送到特定设备?

  8. ios – Firebase Swift – 如何创建子项并将其id添加到另一个ref属性?

    如here所述,我想将Book对象存储在单独的ref中,并将其id值存储在User的books属性中每当我在应用程序中添加一本书时book对象是在Booksref中创建的,但我想立即将其id添加到User的用户书籍数组中.可以用一些漂亮的方式完成,而不是查询书籍,检索它的ID并将其添加到数组中吗?如果不是,查询刚刚创建的对象id的正确方法是什么?也许我不应该使用AutoId模式并在应用程序中为自己创建每个对象的唯一ID?解决方法您可以通过以下方式获取childByAutoId创建的密钥:

  9. ios – 默认应用尚未配置

    我试图将我的应用程序升级到新版本的Firebase.我浏览了设置指南,并编辑了我的所有代码以匹配新的语法.但是,当我运行应用程序时,我会收到这两个错误.我在AppDelegate中有FIRApp.configure(),并将GoogleServices-Info.plist导入到我的项目中.plist也有所有正确的信息.任何人遇到这个或知道如何解决它?

  10. ios – Firebase – 删除和重新安装应用程序不会取消对用户进行身份验证

    在使用以下代码验证用户之后….如果您随后删除该应用程序并将其重新安装在同一台设备上,则该调用将始终返回他们登录.这是为什么?

随机推荐

  1. bluetooth-lowenergy – Altbeacon库无法在Android 5.0上运行

    昨天我在Nexus4上获得了Android5.0的更新,并且altbeacon库停止了检测信标.似乎在监视和测距时,didEnterRegion和didRangeBeaconsInRegion都没有被调用.即使RadiusNetworks的Locate应用程序现在表现不同,一旦检测到信标的值,它们就不再得到更新,并且通常看起来好像信标超出了范围.我注意到的一点是,现在在logcat中出现以下行“B

  2. android – react-native动态更改响应者

    我正在使用react-native进行Android开发.我有一个视图,如果用户长按,我想显示一个可以拖动的动画视图.我可以使用PanResponder实现这一点,它工作正常.但我想要做的是当用户长按时,用户应该能够继续相同的触摸/按下并拖动新显示的Animated.View.如果您熟悉Google云端硬盘应用,则它具有类似的功能.当用户长按列表中的任何项目时,它会显示可拖动的项目.用户可以直接拖

  3. android – 是否有可能通过使用与最初使用的证书不同的证书对其进行签名来发布更新的应用程序

    是否可以通过使用与最初使用的证书不同的证书进行签名来发布Android应用程序的更新?我知道当我们尝试将这样的构建上传到市场时,它通常会给出错误消息.但有没有任何出路,比如将其标记为主要版本,指定市场中的某个地方?解决方法不,你不能这样做.证书是一种工具,可确保您是首次上传应用程序的人.所以总是备份密钥库!

  4. 如何检测Android中是否存在麦克风?

    ..所以我想在让用户访问语音输入功能之前检测麦克风是否存在.如何检测设备上是否有麦克风.谢谢.解决方法AndroidAPI参考:hasSystemFeature

  5. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

  6. android – 获得一首歌的流派

    我如何阅读与歌曲相关的流派?我可以读这首歌,但是如何抓住这首歌的流派,它存放在哪里?解决方法检查此代码:

  7. android – 使用textShadow折叠工具栏

    我有一个折叠工具栏的问题,在展开状态我想在文本下面有一个模糊的阴影,我使用这段代码:用:我可以更改textColor,它可以工作,但阴影不起作用.我为阴影尝试了很多不同的值.是否可以为折叠文本投射阴影?

  8. android – 重用arm共享库

    我已经建立了armarm共享库.我有兴趣重用一个函数.我想调用该函数并获得返回值.有可能做这样的事吗?我没有任何头文件.我试过这个Android.mk,我把libtest.so放在/jni和/libs/armeabi,/lib/armeabi中.此时我的cpp文件编译,但现在是什么?我从objdump知道它的名字编辑:我试图用这个android.mk从hello-jni示例中添加prebuild库:它工作,但libtest.so相同的代码显示以下错误(启动时)libtest.so存在于libhello-j

  9. android – 为NumberPicker捕获键盘’Done’

    我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消.(我知道,这个对话框还没有做它应该保留暂停和恢复状态的事情.)我想在软键盘或其他IME上执行“完成”操作来关闭对话框,就像按下了“OK”一样,因为只有一个小部件可以编辑.看起来处理IME“Done”的最佳方法通常是在TextView上使用setonEditorActionListener.但我没有任何Te

  10. android – 想要在调用WebChromeClient#onCreateWindow时知道目标URL

    当我点击一个带有target=“_blank”属性的超链接时,会调用WebChromeClient#onCreateWindow,但我找不到新的窗口将打开的新方法?主页url是我唯一能知道的东西?我想根据目标网址更改应用行为.任何帮助表示赞赏,谢谢!

返回
顶部