Firebase 在 Android 适配器中添加监听器

2023-11-23

我对 firebase 还很陌生,我正在尝试了解它。 我有一个正在注册的适配器ValueEventListener每次创建时。如果我不分离它,当我旋转手机并且适配器在片段中被破坏/重建时,侦听器是否会增加?或者 firebase 是否足够聪明,知道这个特定的侦听器已经存在?

PS:我尝试在onPause使用它的片段的方法,但 firebase 似乎正在删除我的缓存,因此片段旋转后需要一段时间才能再次获取数据,以前没有发生过这种情况。


好问题。所以,有几点需要注意:

  1. 您将侦听器连接到哪里?如果您将其附加到任何地方but the onResume,它将重新初始化您的侦听器。设置侦听器时,它会触发该特定节点的所有事件。但是,我仍然对我的 Firebase 参考进行所有注册和取消注册onPause, and onResume

  2. 您可以有多个实例任何 Firebase 侦听器的。

    firebase 是否足够聪明,知道这个特定的侦听器已经存在?

    火力基地is知道监听器已经存在并且不会发送相同的事件两次。但是,旋转时您将创建侦听器的新实例。 Firebase 无法将其视为同一个实例化侦听器。因此,您会再次收到所有数据。

  3. Firebase 缓存所有数据。当附加片段并设置侦听器时,firebase 将进行两个主要调用 -

    • 首先 - 检索缓存数据的查询。

    • 第二 - 查询远程数据。

    首先调用缓存很好,因为它在网络缓慢或无网络的情况下仍然有效。现在,请耐心听我说……当 Firebase 从在线服务器接收到该快照时,它将对远程对象和本地对象进行复杂的评估。 Firebase 将尽其所能,使用复杂的 ID 来合并对象,该 ID 利用时间戳和黑魔法 [需要来源]。有了这个新快照,如果需要,它会将其保存到服务器上。然后,**Firebase 仅当日期与缓存版本不同时才会向您提供日期,并且相对于提供所述数据的侦听器实例的更改。这种缓存驱动的结构甚至适用于保存数据时:

    • 首先-保存到缓存。

    • 第二次触发回调。

    • 第三次-尝试保存到服务器。


回答问题

如果您要将侦听器附加到 FirebaseonPause/onResume,您将再次收到所有数据。不再接收它的唯一方法是维护该侦听器的相同实例。

除了维护侦听器实例之外,我还使用了另一种解决方案。在我看来,我不喜欢它。但仍然是我最常使用的。我所做的是

  • 我会保留一个final List<String>,称为ignoredList。该列表将由Stringkey,这将是您适配器中已有对象的键。

  • 然后,在onPause我会将这些数据添加到我的ignoredList并取消childEvent听众。

  • 之后onResume回调我设置了一个新实例childEvent听众。

  • On the onAdded事件侦听器的我根据列表检查新添加的对象。如果我有它,我会将其从列表中删除,仅此而已。本质上是忽略它。如果该对象不在我的ignoredList我会像平常一样处理它。如果我从除onAdded, (i.e. onRemoved onChanged or onMoved)然后我将该事件更改为列表中的该对象并从中删除ignoredList.

现在,我承认这并不是最好的解决方案。你could如果两个源正在修改同一 DataSnapshot,则会看到不正确的数据。这是一个很小的机会,但完全有可能。幸运的是,如果数据集不准确,它不会保存到 Firebase。

我一直在积极寻找更好的策略,如果我找到了,我会分享。与此同时,这个解决方案一直非常适合我的应用程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firebase 在 Android 适配器中添加监听器 的相关文章

随机推荐

  • 如何重新安装 base-R 软件包(例如统计数据、图形、实用程序等)?

    我一直在 R 3 0 1 中使用 stats 包 没有任何问题 但今天我从 R 库位置删除了 stats 文件夹 现在我无法再安装它了 我尝试对其他软件包执行相同的操作 但我可以安装除 stats 之外的所有内容 install packa
  • 对于 64 位进程,kb 显示什么?

    我最近在分析调用堆栈时犯了一个错误 因为我没想到该应用程序是 64 位的 我使用了WinDbg命令kb显示调用堆栈和传递给方法的参数 在 64 位上 参数不是通过堆栈传递 而是通过寄存器 RCX RDX R8 和 R9 传递 看来WinDb
  • NSAttributedString 对齐不适用于 html 内容

    想要更改 html 标签的对齐方式 什么都不起作用 我在 HTML 中没有看到任何 CSS 没有其他设置可以更改对齐方式 我还直接在 UILabel 上设置左对齐 我缺少什么 代码位于 UILabel 扩展中 NSMutableParagr
  • VBA-SQL 对 Excel 工作表进行更新/插入/选择

    简而言之 我正在为我的客户制作一个调度程序 由于限制 它需要位于单个 Excel 文件中 尽可能小 因此 一个工作表充当 UI 而任何其他工作表将充当表格或设置 我正在尝试使用 SQL 我是新手 来处理单个工作表 名为 TblEmpDays
  • malloc 是否会在 Linux(和其他平台)上延迟创建分配的支持页面?

    如果我要在 Linux 上malloc 1024 1024 1024 malloc 实际上做了什么 我确信它会为分配分配一个虚拟地址 通过遍历空闲列表并在必要时创建新映射 但它实际上会创建 1 GiB 的交换页吗 或者是这样mprotect
  • 如何在运行时分配 ToolButton 的 OnClick 事件?

    我在设计时创建了一个没有工具按钮的 TToolBar 我的想法是在运行时创建 ToolButtons 并在创建表单时将它们放在那里 只是为了向用户显示打开了哪些表单 而无需在主菜单中打开 Windows 菜单 我有一个名为 Navigati
  • 外部模块中的模式在 Node.js 中不起作用

    我非常头疼尝试通过一个模块将一些常见的模式定义共享给我的代码库中的所有其他模块 我有一个 myproj schemas 模块 其中包含这两个模式 var mongoose require mongoose util require util
  • 使用 Bullet 和 RSpec gem 减少 n+1 查询

    将 Bullet Gem 与 RSpec 结合使用的有效方法是什么 现在 我觉得如果我将它与当前的单元测试框架一起使用 我会收到很多通知或测试失败 因为测试本身中的 n 1 查询与我的生产应用程序中发生的情况无关 例如检查值或关联 因此 修
  • 如何从 SQL 数据库流式传输 .flv 文件

    我想将 flv 文件存储在数据库中而不是文件系统中 这就是我现在可以做的 使用 ffmpeg 成功将 wmv 和 mpeg 转换为 flv 将图像存储在 SQL Server 中并使用 httphandler 在我的页面上显示它们 与 av
  • Java 计算整数数组中每个元素的出现次数

    我编写了以下代码片段来计算每个元素出现的次数 是否有可能以更短的方式实现这一目标 int arr 1 6 2 8 5 4 7 7 5 7 Arrays stream arr collect ArrayList new ArrayList a
  • 所有可用的 matplotlib 后端的列表

    当前后端名称可通过以下方式访问 gt gt gt import matplotlib pyplot as plt gt gt gt plt get backend GTKAgg 有没有办法获取可在特定机器上使用的所有后端的列表 您可以访问列
  • ASP.NET MVC - Linq to Entities 模型作为 ViewModel - 这是好的做法吗? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 真的是很快的问题 我目前正在使用 asp net MVC 和实体框架构建一个网站 我有几个存储库 它们返回实体或实体列表 我发现在我的大部分页面中 我必须从各种相关表中提取数据 只要我在查
  • 在 Scala 中从类型别名创建对象 [重复]

    这个问题在这里已经有答案了 如何从 scala 中的类型别名构造一个对象 type MyType List Int println List Int println MyType error not found value MyType 这
  • MongoDB 查找日期范围是否与其他日期重叠

    我有许多文档 其架构如下所示 每个文档都包含 开始日期 结束日期 如下架构所示 有没有一种简单的方法可以在保存新文档之前知道新文档的开始日期 结束日期是否会与以前保存的文档开始日期 结束日期重叠 谢谢 title owner notes s
  • ElasticSearch:禁用 Groovy 时对 _score 字段进行聚合

    我见过的每个例子 例如 ElasticSearch 在 score 字段上聚合 用于对 score 字段进行聚合或与 score 字段相关的聚合似乎需要使用脚本 由于 ElasticSearch 出于安全原因默认禁用动态脚本 有没有什么方法
  • 扫描 NFC 标签后是否可以启动应用程序?

    我有一个 NFC 标签 我想编写一个 Android 应用程序 当用手机扫描 NFC 标签时 该应用程序会自动启动并从 NFC 获取数据 假设设备已打开 NFC 并且手机上没有运行其他应用程序 这应该可以工作 我发现一些应用程序可以启动另一
  • 带有实时数据的 NVD3 折线图

    我有一个使用 NVD3 js 编写的非常简单的折线图 我写了一个基于计时器的简单重绘 从我见过的示例中提取 但出现错误 未捕获的类型错误 无法读取未定义的属性 y JS 是 var data key Long values getData
  • C++ 中 lambda 派生的隐式函子的生命周期是多少?

    问题很简单 当我编写 lambda 表达式时 C 编译器自动生成的函子对象的生命周期是多少 我进行了快速搜索 但找不到满意的答案 特别是 如果我将 lambda 传递到某个地方 并且它在那里被记住 然后我超出范围 那么一旦我的 lambda
  • 将 JSON 对象映射到 Swift 类/结构

    我需要 复制 从远程 Web API 服务以 JSON 格式返回的实体 它看起来像这样 field1 some id entity name Entity1 field2 some name details1 field1 11 field
  • Firebase 在 Android 适配器中添加监听器

    我对 firebase 还很陌生 我正在尝试了解它 我有一个正在注册的适配器ValueEventListener每次创建时 如果我不分离它 当我旋转手机并且适配器在片段中被破坏 重建时 侦听器是否会增加 或者 firebase 是否足够聪明