Firebase在Android的适配器中添加侦听器

财务报告率

我在Firebase上还很新,我想把头缠住它。我有此适配器,ValueEventListener每次创建时都会向其注册如果我不拆开它,那么当我旋转手机并且适配器在片段中毁坏/重建时,听众会不会累加起来?还是Firebase足够聪明,可以知道这个特定的侦听器已经存在?

PS:我试图在onPause使用片段方法中注销此侦听器,但是firebase似乎正在删除我的缓存,因此,在片段旋转之后,需要一段时间才能再次获取数据,以前从未发生过。

乍得宾厄姆

好问题。因此,需要注意的几件事:

  1. 您要将听众放在哪里?如果要连接这个任何地方,但onResume,它会重新初始化监听器。设置侦听器时,它将激发该特定节点的所有事件。不过,我还是做我所有的注册和注销在我火力地堡参考onPause,并onResume

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

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

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

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

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

    • 第二-查询远程数据。

    首先调用缓存很不错,因为它在网络缓慢甚至没有网络的情况下仍然可以使用。现在,在这里忍受...当Firebase从联机服务器接收到该快照时,它将对远程对象和本地对象进行复杂的评估。尽其所能,Firebase将使用一个复杂的ID合并对象,该ID利用时间戳和黑魔法[需要的来源]。使用此新快照,如果需要,它将保存到服务器。然后,** Firebase仅在日期不同于缓存版本并且相对于提供所述数据的侦听器实例发生更改时才向您提供日期这种缓存驱动的结构甚至适用于保存数据的时间:

    • 首先保存到缓存。

    • 第二次触发回调。

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


回答问题

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

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

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

  • 然后,onPause我将这些数据添加到我的数据中ignoredList,并使childEvent侦听器无效

  • onResume回调之后,我设置了一个新的childEvent侦听器实例

  • onAdded事件监听器的上,我对照列表检查了新添加的对象。如果有,我将从列表中删除它,仅此而已。本质上忽略它。如果对象不在我中,ignoredList我将像平常一样处理它。如果我从除onAddedonRemoved onChangedonMoved以外的其他回叫中收到该消息,则该事件将更改为列表中的该对象并将其从中删除ignoredList

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

RecyclerView 适配器中的空侦听器

将单击侦听器添加到通用RecyclerView适配器

RecyclerView,适配器,单击侦听器和AsyncTask

哪个更好:密钥侦听器或密钥适配器?

摇摆。适配器/侦听器与数据绑定

JTable鼠标侦听器鼠标适配器

如何在 OnSuccessListener 中的 recyclerview 适配器中传递侦听器

为适配器中活动中的复选框的onClick实现侦听器

Android-从片段到适配器的侦听器值?

如何在Android中转到ListView适配器项单击侦听器以分段?

Android:在“项目”上单击“侦听器”以实现列表视图基本适配器实现

自定义适配器中EditText的文本更改侦听器

如何为适配器中的项目设置侦听器?

无法从Recycler View适配器的setOnClick侦听器中启动活动

使用自定义适配器在AlertDialog中单击侦听器

获取ImageView onClick侦听器在适配器类中的位置

入站JCA适配器的MDB侦听器未在WildFly中启动

为性能而设计的自定义列表阵列适配器:在何处添加侦听器?

使用带有参数的自定义绑定适配器侦听器方法的Android自定义视图

如何在没有空侦听器的 kotlin 上的适配器上实现点击侦听器?

侦听器和适配器之间有什么区别?

Spring 集成事件侦听器入站适配器

如何将侦听器从片段传递到适配器?(科特琳)

如何使用适配器处理项目中视图的单击侦听器?

如何在 recyclerview 适配器上检查空侦听器?

初始化项目选定的侦听器(自定义微调适配器)

Spring入站适配器,多个侦听器与一个

如何在回收器适配器中添加片段?

为什么当我向上或向下滚动列表时,它会在我的自定义光标适配器中激活一个Switch侦听器?