首页 > 解决方案 > 如何避免在活动更改时杀死和重新启动 Firestore 侦听器?

问题描述

这是我的应用程序中的一个用例: 我有一个“房间列表”活动,用户可以在其中看到他加入的所有房间,然后单击其中一个,他进入“聊天室”活动,他可以在其中与那个房间里的其他用户。房间由我的“房间”集合中的 Firestore 文档表示,在房间中发送的消息是该文档的子集合。房间的加入和离开只能通过用户的操作来完成,所以从技术上讲,我可以使用本地信息计算出用户加入的房间列表,而无需查询 firebase。

但是,我希望用户接收他们加入的所有房间的实时更新。例如,在“房间列表”活动中,他们应该能够看到该房间的参与者数量、参与者的姓名等。为此,我目前在我的每个房间文档上运行快照侦听器用户进入“房间列表”活动时加入的房间列表。

问题是,除非我弄错了,否则每次用户浏览应用程序并返回房间列表或聊天室活动时,我都会花费数十次新的 firestore 读取,即使我正在收听的数据没有t实际上改变了。

注意:我正在使用我在这篇文章中详细介绍的一些活动 - 视图模型 - 存储库架构。我还为我的主要导航组件使用了一个带有 3 个片段的活动,其中包括主要活动、房间列表和“我的个人资料”。我已经意识到“单一活动”应用程序设计,但还没有决定完全追求它。(编辑:我使用 Android Room 作为我的 UI 的“单一事实来源”,我的存储库启动 firestore 侦听器,这些侦听器从 firebase 获取数据并将其写入 Room)

因此,我的问题是:android 中是否有一个独立于活动的功能,可以让我一次性设置所有“后台”firestore 监听器,而不会在活动更改之间徒劳地重置它们,从而大大增加每月的成本?

(编辑):事实上,在我的应用程序中实施 Android Room 后不久,我就禁用了 Firestore 缓存,得出的结论是两者存在冲突。也许这是一个很大的错误。根据我对缓存的理解,以下是启用/不启用 Firestore 缓存的情况:

标签: javaandroidgoogle-cloud-firestoreandroid-lifecycle

解决方案


为避免这种情况,您可以使用Android Jetpack 的 ViewModel 组件在活动配置更改之间保留对象。这也适用于 Firestore 查询,尽管您需要大量的管道才能正确执行此操作。完整的讨论对于 Stack Overflow 来说太长了,但是您应该观看我关于 Firebase 和 Jetpack的讨论以了解一些故事,然后查看示例应用程序。您需要注意的是一个自定义LingeringLiveData对象,即使在最后一个观察者被检测到之后,它也会保留一段时间,因此它不会在配置更改后立即关闭查询。

FWIW LiveData 的 Kotlin 扩展也在同一方面“徘徊”,但 Android 没有为 Java 提供类似的解决方案。


推荐阅读