【问题标题】:How to use Firebase's ".info/connected" location in a correct manner to check for internet access?如何以正确的方式使用 Firebase 的“.info/connected”位置来检查互联网访问?
【发布时间】:2020-06-22 23:26:35
【问题描述】:

我在我的 Android 应用中使用 Firebase 实时数据库,并尝试使用 Firebase 的 .info/connected 位置来检查互联网访问,但我无法以可靠的方式使用它来检查连接状态。

根据docs

Firebase 实时数据库在 /.info/connected 提供一个特殊位置,每次 Firebase 实时数据库客户端的连接状态发生变化时都会更新该位置。

例如,我的应用主屏幕中有一个 RecyclerView,它依赖于从 RTDB 获取的数据,就像这样

// Fragment

sellerRV = binding.sellerInfoRecyclerView
val adapter = SellerRecyclerViewAdapter()

sellerViewModel.initLoadingBalanceData()

// I am not doing anything after knowing about the connection state, just checking where I should call it
sellerViewModel.checkFBConnectivity()

sellerViewModel.repoBalanceDataListener.observe(viewLifecycleOwner, Observer {
    adapter.submitList(sellerBalanceList)
    sellerRV.adapter = adapter
})

在显示的位置检查连接状态(可能是天真的)并运行应用程序后,Log 看起来像这样

2020-06-22 00:28:30.843 10092-10092/com.example.paylater D/firebaseRepo: not connected
2020-06-22 00:28:33.032 10092-10092/com.example.paylater D/firebaseRepo: connected

即使列表是可见的,并且输出是正确的。

所以,我的问题是,我应该如何(或在哪里)检查连接状态,以便以一致且可靠的方式了解用户是否已连接,然后决定开始获取数据?

【问题讨论】:

  • 您遇到了什么问题?文档很清楚如何查询该特殊位置。您必须找到一种方法,以符合您的应用程序架构和 UI 要求的方式将其应用到您的应用程序中。这是一系列相当广泛的决定。
  • 日志输出对我来说看起来很正常。由于客户端连接到 Firebase 服务器需要几秒钟的时间,因此它首先使用false 触发.info/connected 事件,然后在建立连接后使用true。这种行为有什么问题?
  • @FrankVanPuffelen 我面临的问题是我需要查询位置以了解是否应该通知最终用户连接到网络,如果他们还没有这样做,但由于它在开始时触发false,因此我无法在启动时检查它以了解状态。但是看到你的评论,我意识到它很自然地先给false,然后给true。因此,关于这一点,您对在检查然后查询位置以查看它是否已连接然后告诉用户他们是否离线之前进行某种延迟工作有什么建议。

标签: android firebase firebase-realtime-database


【解决方案1】:

由于客户端连接到 Firebase 服务器需要几秒钟的时间,因此它首先使用 false 触发 .info/connected 事件,然后在建立连接后使用 true 触发。

应用程序向用户显示这一点的通常方式是在启动时显示“正在连接...”消息或动画,然后稍等片刻。如果建立了连接(因此侦听器变为true),它们将删除该消息。如果经过一定的时间间隔,它们会显示“这比预期花费的时间长,请检查您的互联网连接”类型的消息。

【讨论】:

  • 非常感谢您回答这个问题,事后看来,这似乎是一个愚蠢的问题。另外,我希望这不是无关紧要的,因为我专门连接到 Firebase 服务器,我是否也需要对设备执行网络检查,或者我只能通过这个检查与服务器的连接方法?
  • 这完全取决于您要完成的工作。如果您想向用户显示他们是否已连接到数据库,只需收听.info/connected 即可。但是如果你想通知他们是否有网络连接,你应该(也)检查that
  • 哦,好吧,我明白你的意思了。因此,如果我需要特别通知我的用户,即使他们连接到网络,他们也需要连接到 Firebase 服务器,那么我会选择后者以及 Firebase .info/connected 查询,如果我的意图是只通知他们他们没有连接到 Firebase 服务器然后我只去.info/connected 查询。最后,非常感谢您抽出宝贵时间回答我的所有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 2013-03-24
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多