В приложении Android, которое в большинстве случаев должно работать в автономном режиме, когда мне нужно, выполнять некоторые синхронные операции, например:
User myUser = MyclientFacade.getUser();
If (myUser.getScore > 10) {
DoSomething()
}
Где Пользователь POJO, заполненный Firebase;
Проблема возникает при активации кеша Firebase
Firebase.getDefaultConfig().setPersistenceEnabled(true);
и пользователь уже находится в кеше, и данные обновляются в Firebase DB третьей стороной (или даже другим устройством). Действительно, когда я запрашиваю Firebase, чтобы получить User, я сначала получаю данные из кэша, а затем второе событие изменения с последними данными с сервера 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
или addListenerForSingleValueEvent
, смешанный с ref.keepSynced
:
Скажем, значение моего пользователя в кеше равно 5, а из Firebase DB - 11.
Когда я звоню getUser
, я получу оценку 5 (сначала запросить кеш Firebase), поэтому я не буду называть метод doSomething()
.
Если я раскомментирую код Thread.sleep()
из моего примера, кеш Firebase будет иметь достаточно времени для обновления, а мой getUser
вернет правильное значение оценки (11).
Итак, как я могу напрямую задать последнее значение непосредственно со стороны сервера и обойти кеш?