在服务内部时需要明确Firebase数据库行为

时间:2017-02-08 22:43:44

标签: firebase firebase-realtime-database

我正在测试一项功能,该功能需要每天午夜进行Firebase数据库写入。现在有可能在此特定时间,客户端应用程序可能无法连接到互联网。

我一直在使用Firebase并保持关闭,因为这可能会导致我的另一个功能中的陈旧数据问题。

根据我的观察,如果我在写入之前断开应用程序并保持这种方式一分钟左右,当我再次打开连接并执行写入时,Firebase最终会重新连接。

我的主要问题是:

  • 即使连接丢失了几个小时,这种行为也会保持一致吗?

  • Firebase会超时吗?

由于它位于永久运行的服务中,它是否仍需要持久性以确保写入不会丢失? (假设服务没有重启)。

如果服务重新启动,写入是否会丢失?

1 个答案:

答案 0 :(得分:1)

我对这个确切的案例有一些经验,我实际上不建议使用后台服务来管理您的Firebase请求。实际上,我不建议完全管理Firebase请求(稍后解释)。

服务,即使我们可以让它们永远运行,实际上也会被系统杀死很多(除非你将它们的CPU优先级设置为更高的级别,但即使这样,系统仍然会杀死它们)。 p>

如果您拨打Firebase写入电话(任何类型),并且您的服务被终止,写入将会丢失,如您所说。除非,您创建了一个复杂的管理器,您可以在其中存储尚未提交到内部存储的请求,并在每次重新启动服务时加载它们 - 但考虑到Firebase开发人员这一事实,这是一项非常肮脏的工作。照顾我们并制作.setPersistenceEnabled(true):)

我知道,你提到你不想使用它,但我强烈建议你这样做。它的工作方式就像魅力一样,无需任何服务,您无需担心管理写入请求。也许最好解决你所拥有的另一个问题,以便实现这一目标。

总结一下,这就是我要做的事情:

  1. 我会在开头的某个地方调用.setPersistenceEnabled(true)(扩展Application类,建议从onCreate()调用它)
  2. 我会使用Android AlarmManager并注册BroadcastReceiver以在午夜收到警报(重复或不重复 - 您决定)
  3. 在BroadcastReceiver中,我只是调用Firebase的写函数而不用担心:)
  4. 确保我涵盖了您的所有问题:

    1.   

      这种行为会保持一致......

    2. 没有。案例场景:午夜时间,您的服务已成功接听电话,现在正在尝试写入Firebase。例如,如果用户在上午6点之前没有连接(只是一个案例场景),那么系统很可能会在这6个小时内将其终止,并且您的写入将会丢失。飞行时间,或停留在没有互联网覆盖的区域 - 这两个都是可能破坏应用程序一致性的风险场景的例子

      1.   

        Firebase会超时吗?

      2. 如上所述,它绝对可以。我不会承担风险并制作一个80-90%的工作应用程序。使用持久性并拥有100%正常工作的应用程序:)

        我相信我已经涵盖了其他问题......

        祝你好运!