【问题标题】:Firebase adding listeners in adapters in AndroidFirebase在Android的适配器中添加监听器
【发布时间】:2015-04-08 22:58:34
【问题描述】:

我是 firebase 的新手,我正在努力解决它。 我有这个适配器,每次创建它时都会注册到ValueEventListener。如果我不分离它,当我旋转手机并且适配器在片段中被破坏/重建时,听众会加起来吗?还是 firebase 足够聪明,可以知道这个特定的侦听器已经存在?

PS:我尝试在使用它的片段的onPause 方法中取消注册此侦听器,但firebase 似乎正在删除我的缓存,因此片段旋转后需要一段时间才能获取数据,以前没有发生过。

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

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

    1. 你在哪里附加你的监听器?如果你把它附加到任何地方onResume,它会重新初始化你的监听器。设置侦听器时,它会触发该特定节点的所有事件。但是,我仍然在 onPauseonResume 中对我的 Firebase 参考进行所有注册和注销操作

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

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

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

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

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

      • Second - 对远程数据的查询。

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

      • 首先 - 保存到缓存。

      • 第二次触发回调。

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


    回答问题

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

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

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

    • 然后,在onPause 中,我将把这些数据添加到我的ignoredList 中,并取消childEvent 监听器。

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

    • 在事件侦听器的onAdded 上,我根据我的列表检查新添加的对象。如果我有它,我会将它从列表中删除,仅此而已。基本上无视它。如果对象不在我的ignoredList 中,我会像往常一样处理它。如果我从onAdded 以外的回调之一(即onRemoved onChangedonMoved)收到它,那么我会将事件更改为列表中的该对象并从ignoredList 中删除。

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

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

    【讨论】:

    • 嗯,你的回答是正确的,我可以告诉你,你也一直在用 firebase 挠头,这让我们两个。您的解决方案非常好,但是在我看来,您的数据将存储两次(第一次在您的 ingoredList 数组中,第二次在缓存火力库中自动为您执行,但至少在理论上它会起作用)。因此,考虑到这一点,这就是我最终要做的事情:有一个 beta 功能,即使删除了所有侦听器,也可以让您的数据保持不变 Firebase.getDefaultConfig().enablePersistence();
    • 有了这个,您不必担心丢失数据,而且您只需存储一次。欲了解更多信息:groups.google.com/forum/#!topic/firebase-talk/gYlnLgQ-Yhk
    • 啊非常好。我没有考虑过。我的解决方案实际上只适用于小列表。一个黑客,而不是。
    • 为像我这样的新手精心打造.. :)
    • 假设我有一个在后台运行的同步服务,并且只有在用户通过身份验证时才会同步。在这种情况下,我应该只使用 Firebase Auth Listener 作为后台服务,还是应该在所有地方添加监听器,如注册活动、登录活动等。那么我应该使用多个还是单个 Auth Listener? @ChadBingham
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多