在大多数时间必须离线工作的 Android 应用程序上,当它在线时,我需要执行一些同步操作,即:
User myUser = MyclientFacade.getUser();
If (myUser.getScore > 10) {
DoSomething()
}
其中 User 是 Firebase 填充的 POJO;
激活 Firebase 缓存时会出现此问题
Firebase.getDefaultConfig().setPersistenceEnabled(true);
并且用户已经在缓存中,并且数据由第三方(甚至其他设备)在 Firebase DB 上更新。事实上,当我查询 Firebase 来获取用户时,我首先从缓存中获取数据,然后使用 Firebase 服务器中的最新数据获取第二个更改事件,但为时已晚!
让我们看看同步方法 MyclientFacade.getUser() :
Public User getUser() {
Firebase ref = myFireBaseroot.child("User").child(uid);
ref.keepSynced(true);
/* try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
final CountDownLatch signal = new CountDownLatch(1);
ref.addListenerForSingleValueEvent(new ValueEventListener() {
//ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
this.user = dataSnapshot.getValue(User.class);
signal.countDown();
}
@Override
public void onCancelled(FirebaseError firebaseError) {
signal.countDown();
}
});
signal.await(5, TimeUnit.SECONDS);
ref.keepSynced(false);
return this.user;
}
如果我使用,我会得到相同的行为addValueEventListener
or addListenerForSingleValueEvent
夹杂ref.keepSynced
:
假设我的用户在缓存中的得分值为 5,来自 Firebase DB 的得分值为 11。
当我打电话时getUser
我将获得 5 分(Firebase 首先询问缓存),因此我不会调用doSomething()
method.
如果我取消注释Thread.sleep()
从我的示例代码来看,Firebase 缓存将有足够的时间进行更新,并且我的getUser
将返回正确的分数值 (11)。
那么如何直接从服务器端询问最新值并绕过缓存呢?