【问题标题】:How to avoid killing and relaunching firestore listeners on activity change?如何避免在活动更改时杀死和重新启动 Firestore 侦听器?
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 我确实使用了带有 Android Room 和 LiveData 的 android jetpack 模型。我会欣然承认,作为 Android 的初学者首次实现它被证明是棘手的,而且我很可能在此过程中犯了一些错误。在实现 Android Room 后,我还禁用了 firebase 缓存。我更新了我对 Firestore 缓存如何工作的理解 - 你能确认我描述的场景是正确的吗?谢谢 ! (除此之外,我很快就会观看和阅读您提供的链接)
    • 您现在的帖子中有太多问题 - 它们不一定都相互关联。我已经回答了第一个主要问题,即在配置更改时如何使查询保持活跃。我建议将您的其他问题分成不同的帖子,以便其他人在通过搜索到达这里时更容易理解整个事情。
    猜你喜欢
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 2021-06-08
    相关资源
    最近更新 更多