gpt4 book ai didi

android - Firebase 离线功能和 addListenerForSingleValueEvent

转载 作者:IT王子 更新时间:2023-10-28 23:42:20 24 4
gpt4 key购买 nike

每当我将 addListenerForSingleValueEventsetPersistenceEnabled(true) 一起使用时,我只能设法获得 DataSnapshot 的本地脱机副本,而 NOT 来自服务器的更新后的 DataSnapshot

但是,如果我将 addValueEventListenersetPersistenceEnabled(true) 一起使用,我可以从服务器获取 DataSnapshot 的最新副本。

这对于 addListenerForSingleValueEvent 是否正常,因为它仅在本地(离线)搜索 DataSnapshot 并在成功检索 DataSnapshot ONCE 后删除其监听器(离线或在线)?

最佳答案

更新(2021 年):一个新方法调用(get on AndroidgetData on iOS)实现了您想要的行为:它首先尝试从服务器获取最新值,只有在无法到达服务器时才回退到缓存中。使用持久监听器的建议仍然适用,但至少有一个更简洁的选项,即使您启用了本地缓存,也可以获取一次数据。


持久性的工作原理

Firebase 客户端会在内存中保留一份您正在积极收听的所有数据的副本。一旦最后一个监听器断开连接,数据就会从内存中刷新。

如果您在 Firebase Android 应用程序中启用磁盘持久性:

Firebase.getDefaultConfig().setPersistenceEnabled(true); 

Firebase 客户端将保存应用最近收听的所有数据的本地副本(在磁盘上)。

附加监听器时会发生什么

假设你有以下 ValueEventListener:

ValueEventListener listener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
System.out.println(snapshot.getValue());
}

@Override
public void onCancelled(FirebaseError firebaseError) {
// No-op
}
};

当您将 ValueEventListener 添加到位置时:

ref.addValueEventListener(listener); 
// OR
ref.addListenerForSingleValueEvent(listener);

如果该位置的值在本地磁盘缓存中,Firebase 客户端将立即为本地缓存中的该值调用 onDataChange()。然后,如果还将启动与服务器的检查,以询问对值的任何更新。如果自上次添加到缓存后服务器上的数据发生更改,它可能随后再次调用 onDataChange()

使用 addListenerForSingleValueEvent

会发生什么

当您将单值事件监听器添加到同一位置时:

ref.addListenerForSingleValueEvent(listener);

Firebase 客户端将(与之前的情况一样)立即为本地磁盘缓存中的值调用 onDataChange()。它不会再调用 onDataChange() 次,即使服务器上的值不同。请注意,更新的数据仍将被请求并在后续请求中返回。

这在之前的 How does Firebase sync work, with shared data? 中有介绍

解决方案和解决方法

最好的解决办法是使用addValueEventListener() ,而不是单值事件监听器。常规值监听器将同时获取即时本地事件和来自服务器的潜在更新。

第二种解决方案是使用新的 get method (于 2021 年初推出),它没有这种有问题的行为。请注意,此方法始终尝试首先从服务器获取值,因此需要更长的时间才能完全完成。如果您的值永远不会改变,使用 addListenerForSingleValueEvent 可能会更好(但在这种情况下您可能不会出现在此页面上)。

作为一种解决方法,您还可以 call keepSynced(true)在您使用单值事件监听器的位置。这样可以确保数据在发生变化时得到更新,从而大大提高单值事件监听器看到当前值的机会。

关于android - Firebase 离线功能和 addListenerForSingleValueEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34486417/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com