【发布时间】:2019-12-26 05:43:08
【问题描述】:
这是我的应用中的一个用例: 我有一个“房间列表”活动,用户可以在其中看到他加入的所有房间,然后单击其中一个,他进入“聊天室”活动,在那里他可以与该房间的其他用户聊天。房间由我的“房间”集合中的 firestore 文档表示,在房间中发送的消息是该文档的子集合。房间的加入和离开只能通过用户的操作来完成,所以从技术上讲,我可以使用本地信息计算出用户加入的房间列表,而无需查询 firebase。
但是,我希望用户能够收到他们加入的所有房间的实时更新。例如,在“房间列表”活动中,他们应该能够看到该房间的参与者数量、参与者的姓名等。为此,我目前在我的每个房间文档上运行快照侦听器用户进入“房间列表”活动时加入的房间列表。
问题是,除非我弄错了,否则每次用户浏览应用程序并返回房间列表或聊天室活动时,我都会花费数十次新的 firestore 读取,即使在我正在收听的数据实际上并没有改变。
注意:我正在使用我在this post 中详述的一些活动 - 视图模型 - 存储库架构。我还为我的主要导航组件使用带有 3 个片段的单个活动,其中包括主要活动、房间列表和“我的个人资料”。我已经意识到“单一活动”的应用程序设计,但还没有决定完全追求它。 (编辑:我使用 Android Room 作为 UI 的“单一事实来源”,我的存储库启动 firestore 侦听器,这些侦听器从 firebase 获取数据并将其写入 Room)
我的问题是因此:android 中是否有一个独立于活动的功能,可以让我一次性设置所有“后台”firestore 监听器,而不会在活动更改之间徒劳地重置它们,因此大大增加每月费用?
(编辑):事实上,在我的应用中实施 Android Room 后不久,我就禁用了 Firestore 缓存,得出的结论是两者存在冲突。也许这是一个很大的错误。根据我对缓存的理解,以下是启用/不启用 Firestore 缓存的情况:
通过缓存,我进入“房间列表”活动,加载我加入的十个房间,然后浏览应用程序。几分钟后,当我返回“房间列表”活动时,我的活动尝试再次启动侦听器,并且 Firebase 识别出在此期间没有发生任何文档更新,因此花费了我零(或一次?)文档读取。
没有缓存,我进入“房间列表”活动,加载我加入的十个房间,然后浏览应用程序。当我稍后返回“房间列表”活动时,我的活动再次启动侦听器,并且由于缓存被禁用,firebase 只是将我再次加入的十个房间的列表返回给我,从而使我徒劳地读取了 10 个文档。
【问题讨论】:
标签: java android google-cloud-firestore android-lifecycle