我在Firebase上还很新,我想把头缠住它。我有此适配器,ValueEventListener
每次创建时都会向其注册。如果我不拆开它,那么当我旋转手机并且适配器在片段中毁坏/重建时,听众会不会累加起来?还是Firebase足够聪明,可以知道这个特定的侦听器已经存在?
PS:我试图在onPause
使用片段的方法中注销此侦听器,但是firebase似乎正在删除我的缓存,因此,在片段旋转之后,需要一段时间才能再次获取数据,以前从未发生过。
好问题。因此,需要注意的几件事:
您要将听众放在哪里?如果要连接这个任何地方,但在onResume
,它会重新初始化监听器。设置侦听器时,它将激发该特定节点的所有事件。不过,我还是做我所有的注册和注销在我火力地堡参考onPause
,并onResume
您可以具有任何Firebase侦听器的多个实例。
Firebase是否足够聪明,可以知道这个特定的侦听器已经存在?
火力地堡是知道听众已经存在并不会两次发送相同的事件。但是,在旋转时,您正在创建侦听器的新实例。Firebase无法将其视为相同的实例侦听器。因此,您再次收到所有数据。
Firebase缓存所有数据。附加片段并设置侦听器后,firebase将进行两个主要调用-
首先-查询以检索缓存的数据。
第二-查询远程数据。
首先调用缓存很不错,因为它在网络缓慢甚至没有网络的情况下仍然可以使用。现在,在这里忍受...当Firebase从联机服务器接收到该快照时,它将对远程对象和本地对象进行复杂的评估。尽其所能,Firebase将使用一个复杂的ID合并对象,该ID利用时间戳和黑魔法[需要的来源]。使用此新快照,如果需要,它将保存到服务器。然后,** Firebase仅在日期不同于缓存版本并且相对于提供所述数据的侦听器实例发生更改时才向您提供日期。这种缓存驱动的结构甚至适用于保存数据的时间:
首先保存到缓存。
第二次触发回调。
第三次尝试保存到服务器。
如果您将侦听器附加到Firebase onPause
/ onResume
,则将再次收到所有数据。不再接收它的唯一方法是维护该侦听器的相同实例。
除了维护侦听器实例之外,我还使用了另一种解决方案。我认为我不喜欢它。但仍然是我最常使用的。我要做的是
我将保留一个final List<String>
,称为ignoredList
。该列表将由一个String
密钥构建,这将是您适配器中已具有的对象的密钥。
然后,onPause
我将这些数据添加到我的数据中ignoredList
,并使childEvent
侦听器无效。
onResume
回调之后,我设置了一个新的childEvent
侦听器实例。
在onAdded
事件监听器的上,我对照列表检查了新添加的对象。如果有,我将从列表中删除它,仅此而已。本质上忽略它。如果对象不在我中,ignoredList
我将像平常一样处理它。如果我从除onAdded
(onRemoved
onChanged
或onMoved
)以外的其他回叫中收到该消息,则该事件将更改为列表中的该对象并将其从中删除ignoredList
。
现在,我承认这并不是最漂亮的解决方案。你可以看到不正确的数据,如果两个来源被修改同一DataSnapshot。这将是一次很小的机会,但完全有可能。幸运的是,如果数据集不正确,它将不会保存到Firebase。
我一直在积极寻求更好的策略,如果能找到一个我会分享的。同时,此解决方案一直非常适合我的应用程序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句