每当我使用addListenerForSingleValueEvent
时setPersistenceEnabled(true)
,我只能设法从服务器获取本地脱机副本DataSnapshot
而不是更新DataSnapshot
.
但是,如果我用addValueEventListener
用setPersistenceEnabled(true)
,我可以得到的最新副本DataSnapshot
从服务器.
这是正常的,addListenerForSingleValueEvent
因为它只搜索DataSnapshot
本地(离线)并在成功检索DataSnapshot
ONCE(离线或在线)后删除其侦听器?
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()
.请注意,仍会请求更新的数据并在后续请求中返回.
之前在Firebase如何与共享数据同步工作中介绍了这一点?
解决方案和解决方法最好的解决方案是使用addValueEventListener()
而不是单值事件监听器.常规值侦听器将从服务器获取直接本地事件和潜在更新.
作为解决方法,您还可以调用keepSynced(true)
使用单值事件侦听器的位置.这可确保数据在更改时进行更新,从而大大提高单值事件侦听器查看当前值的可能性.