gpt4 book ai didi

java - 如何避免在 Activity 更改时杀死并重新启动 firestore 监听器?

转载 作者:行者123 更新时间:2023-12-02 01:10:26 24 4
gpt4 key购买 nike

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

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

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

注释:我正在使用一些 Activity - viewmodel - 存储库架构,我在 this post 中详细介绍了这些架构。 。我还使用一个包含 3 个 fragment 的 Activity 作为我的主要导航组件,其中包括主要 Activity 、房间列表和“我的个人资料”。我已经意识到“单一 Activity ”应用程序设计,但尚未决定完全追求它。(编辑:我使用 Android Room 作为 UI 的“单一事实来源”,并且我的存储库启动 Firestore 监听器,这些监听器从 Firebase 获取数据并将其写入 Room)

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

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

  • 通过缓存,我进入“房间列表” Activity ,加载我加入的十个房间,然后浏览应用程序。几分钟后,当我返回“房间列表” Activity 时,我的 Activity 尝试再次启动监听器,并且 Firebase 识别出在此期间没有发生任何文档更新,因此导致我的文档读取次数为零(或一?)。

  • 在没有缓存的情况下,我进入“房间列表” Activity ,加载我加入的十个房间,然后浏览应用程序。当我稍后返回“房间列表” Activity 时,我的 Activity 再次启动监听器,并且由于禁用了缓存,Firebase 只是将我再次加入的 10 个房间的列表返回给我,从而白白浪费了 10 个文档读取的时间。

最佳答案

为了避免这种情况,您可以使用Android Jetpack's ViewModel component在 Activity 配置更改之间保留对象。 。这也适用于 Firestore 查询,尽管您需要大量的管道才能正确执行此操作。对于 Stack Overflow 来说,完整的讨论太长了,但你应该观看 my talk about Firebase and Jetpack想要了解一些故事,那么check out the sample app 。您需要注意的是一个自定义 LingeringLiveData 对象,即使在检测到最后一个观察者之后,该对象也会保留一段时间,因此它不会在配置更改后立即关闭查询。

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

关于java - 如何避免在 Activity 更改时杀死并重新启动 firestore 监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59484279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com