我对 firebase 还很陌生,我正在尝试了解它。
我有一个正在注册的适配器ValueEventListener
每次创建时。如果我不分离它,当我旋转手机并且适配器在片段中被破坏/重建时,侦听器是否会增加?或者 firebase 是否足够聪明,知道这个特定的侦听器已经存在?
PS:我尝试在onPause
使用它的片段的方法,但 firebase 似乎正在删除我的缓存,因此片段旋转后需要一段时间才能再次获取数据,以前没有发生过这种情况。
好问题。所以,有几点需要注意:
您将侦听器连接到哪里?如果您将其附加到任何地方but the onResume
,它将重新初始化您的侦听器。设置侦听器时,它会触发该特定节点的所有事件。但是,我仍然对我的 Firebase 参考进行所有注册和取消注册onPause
, and onResume
-
您可以有多个实例任何 Firebase 侦听器的。
firebase 是否足够聪明,知道这个特定的侦听器已经存在?
火力基地is知道监听器已经存在并且不会发送相同的事件两次。但是,旋转时您将创建侦听器的新实例。 Firebase 无法将其视为同一个实例化侦听器。因此,您会再次收到所有数据。
-
Firebase 缓存所有数据。当附加片段并设置侦听器时,firebase 将进行两个主要调用 -
首先 - 检索缓存数据的查询。
第二 - 查询远程数据。
首先调用缓存很好,因为它在网络缓慢或无网络的情况下仍然有效。现在,请耐心听我说……当 Firebase 从在线服务器接收到该快照时,它将对远程对象和本地对象进行复杂的评估。 Firebase 将尽其所能,使用复杂的 ID 来合并对象,该 ID 利用时间戳和黑魔法 [需要来源]。有了这个新快照,如果需要,它会将其保存到服务器上。然后,**Firebase 仅当日期与缓存版本不同时才会向您提供日期,并且相对于提供所述数据的侦听器实例的更改。这种缓存驱动的结构甚至适用于保存数据时:
首先-保存到缓存。
第二次触发回调。
第三次-尝试保存到服务器。
回答问题
如果您要将侦听器附加到 FirebaseonPause
/onResume
,您将再次收到所有数据。不再接收它的唯一方法是维护该侦听器的相同实例。
除了维护侦听器实例之外,我还使用了另一种解决方案。在我看来,我不喜欢它。但仍然是我最常使用的。我所做的是
我会保留一个final List<String>
,称为ignoredList
。该列表将由String
key,这将是您适配器中已有对象的键。
然后,在onPause
我会将这些数据添加到我的ignoredList
并取消childEvent
听众。
之后onResume
回调我设置了一个新实例childEvent
听众。
On the onAdded
事件侦听器的我根据列表检查新添加的对象。如果我有它,我会将其从列表中删除,仅此而已。本质上是忽略它。如果该对象不在我的ignoredList
我会像平常一样处理它。如果我从除onAdded
, (i.e. onRemoved
onChanged
or onMoved
)然后我将该事件更改为列表中的该对象并从中删除ignoredList
.
现在,我承认这并不是最好的解决方案。你could如果两个源正在修改同一 DataSnapshot,则会看到不正确的数据。这是一个很小的机会,但完全有可能。幸运的是,如果数据集不准确,它不会保存到 Firebase。
我一直在积极寻找更好的策略,如果我找到了,我会分享。与此同时,这个解决方案一直非常适合我的应用程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)