【问题标题】:How long for addListenerForSingleValueEvent to update?addListenerForSingleValueEvent 更新多久?
【发布时间】:2023-02-01 12:45:57
【问题描述】:

Firebase 在实时数据库的 documentation 中描述了 3 种读取方法:

  1. get() 到达云端并获取一个值;
  2. addValueEventListener() 立即更新;和
  3. addListenerForSingleValueEvent() 更新,嗯,嗯,具体什么时候?

    第三个选项“有效”,它得到更新,但什么时候?对它进行试验,我有时看到它在 2 分钟后更新,有时 30 分钟后,一旦我关闭笔记本电脑并上床睡觉,第二天又回来了,但它仍然没有。

    有谁知道可以期待什么?

    谢谢

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    addListenerForSingleValueEvent 是 Firebase SDK 中用于一次检索值的原始方法。随着时间的推移,我们发现它有一种极端情况,这可能正是某些人想要的,但却是绝大多数用户不希望出现的行为。我在这里记录了这一点:Firebase Offline Capabilities and addListenerForSingleValueEvent

    对于新代码,您应该使用get(),并且只有在上述边缘情况正是您想要的情况下才考虑addListenerForSingleValueEvent(应该是极其稀有的)。

    【讨论】:

      【解决方案2】:

      在这里回复弗兰克,因为我的后续问题很长:

      感谢您提供的出色链接。

      我们使用 RTDB 作为后端(编写器)和移动设备(读取器)之间的总线。数据库很大,它的某些部分偶尔会发生变化(每天变化很少)。一个典型的客户端(移动设备)登录一次,我们就再也见不到他们了。有些人一个月出现一次,很少有人一周出现一次。很少有人会在 24 小时内出现两次。每当客户登录时,我们都希望他们看到最新的数据(请注意,我们的应用程序可能在后台,已登录。)

      在会话期间,设备访问同一个 RDTB 点数十次/数百次。在实时会话期间,如果后端发生更改,我们希望设备获得更新(后端更新可能是部分的,因此设备已知的数据可能变得不一致。)

      从这个角度来看最小化网络成本(我们付给谷歌的),这样说对吗:

      1. get() 效率低下,因为它为同一条数据在网络中传输了 100 次。
      2. keepSynced() 是一个非常糟糕的主意,因为它使所有这些设备保持最新状态,即使它们永远不会再次使用该应用程序。
      3. addValueEventListener() 不是一个好主意,因为它使用设备不需要的(大量)数据更新设备;它中断了来自后端的(部分)更新的会话。
      4. addListenerForSingleValueEvent() 不是一个好主意,因为它不会更新...

        那么,如果您同意,那么我们应该采用什么策略? 谢谢!

      【讨论】:

        猜你喜欢
        • 2018-08-11
        • 1970-01-01
        • 2010-10-17
        • 2016-05-20
        • 2019-08-03
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多