java - 如何避免在活动更改时杀死和重新启动 Firestore 侦听器?
问题描述
这是我的应用程序中的一个用例: 我有一个“房间列表”活动,用户可以在其中看到他加入的所有房间,然后单击其中一个,他进入“聊天室”活动,他可以在其中与那个房间里的其他用户。房间由我的“房间”集合中的 Firestore 文档表示,在房间中发送的消息是该文档的子集合。房间的加入和离开只能通过用户的操作来完成,所以从技术上讲,我可以使用本地信息计算出用户加入的房间列表,而无需查询 firebase。
但是,我希望用户接收他们加入的所有房间的实时更新。例如,在“房间列表”活动中,他们应该能够看到该房间的参与者数量、参与者的姓名等。为此,我目前在我的每个房间文档上运行快照侦听器用户进入“房间列表”活动时加入的房间列表。
问题是,除非我弄错了,否则每次用户浏览应用程序并返回房间列表或聊天室活动时,我都会花费数十次新的 firestore 读取,即使我正在收听的数据没有t实际上改变了。
注意:我正在使用我在这篇文章中详细介绍的一些活动 - 视图模型 - 存储库架构。我还为我的主要导航组件使用了一个带有 3 个片段的活动,其中包括主要活动、房间列表和“我的个人资料”。我已经意识到“单一活动”应用程序设计,但还没有决定完全追求它。(编辑:我使用 Android Room 作为我的 UI 的“单一事实来源”,我的存储库启动 firestore 侦听器,这些侦听器从 firebase 获取数据并将其写入 Room)
因此,我的问题是:android 中是否有一个独立于活动的功能,可以让我一次性设置所有“后台”firestore 监听器,而不会在活动更改之间徒劳地重置它们,从而大大增加每月的成本?
(编辑):事实上,在我的应用程序中实施 Android Room 后不久,我就禁用了 Firestore 缓存,得出的结论是两者存在冲突。也许这是一个很大的错误。根据我对缓存的理解,以下是启用/不启用 Firestore 缓存的情况:
通过缓存,我进入“房间列表”活动,加载我加入的十个房间,然后浏览应用程序。几分钟后,当我返回“房间列表”活动时,我的活动尝试再次启动侦听器,并且 Firebase 识别出在那段时间没有发生任何文档更新,因此花费了我零(或一次?)文档读取。
在没有缓存的情况下,我进入“房间列表”活动,加载我加入的十个房间,然后浏览应用程序。当我稍后返回“房间列表”活动时,我的活动再次启动侦听器,并且由于缓存被禁用,firebase 只是将我再次加入的十个房间的列表返回给我,从而使我徒劳地读取了 10 个文档。
解决方案
为避免这种情况,您可以使用Android Jetpack 的 ViewModel 组件在活动配置更改之间保留对象。这也适用于 Firestore 查询,尽管您需要大量的管道才能正确执行此操作。完整的讨论对于 Stack Overflow 来说太长了,但是您应该观看我关于 Firebase 和 Jetpack的讨论以了解一些故事,然后查看示例应用程序。您需要注意的是一个自定义LingeringLiveData
对象,即使在最后一个观察者被检测到之后,它也会保留一段时间,因此它不会在配置更改后立即关闭查询。
FWIW LiveData 的 Kotlin 扩展也在同一方面“徘徊”,但 Android 没有为 Java 提供类似的解决方案。
推荐阅读
- javascript - 与在反应中增加和减少计数器有关的基本问题
- c# - 将 CRL 分发点 (CDP) 扩展添加到 X509Certificate2 证书
- jquery - 如何从 JSON 值创建超链接?
- c# - 从 ASP.NET Core 2.2 迁移后,ASP.NET Core 3.1.1 Jwt 重定向而不是返回 http 状态 401
- c++ - 为什么 lambda 函数没有复制出结构?
- r - 让 range_boundaries_to_cidr 运行一个数据向量,给出错误“期望单个值”错误
- plsql - Oracle APEX - 处理 APEX 内部错误
- python-3.x - python:Selenium 保存空文件
- c++ - c ++:搜索数组
- azure - 从 MS Dynamics365 CRM 插件代码访问 Azure Keyvault