На Android приложение, которое должно работает в автономном режиме большую часть времени мне нужно, когда это в Интернете, чтобы сделать некоторые синхронные операции на то:Как обойти кеш Firebase для обновления данных (в Android-приложении)?
User myUser = MyclientFacade.getUser();
If (myUser.getScore > 10) {
DoSomething()
}
Где Пользователь является POJO заполнен Firebase;
Проблема возникает, когда кэш Firebase активируется
Firebase.getDefaultConfig().setPersistenceEnabled(true);
и пользователь уже находится в кэше, и данные обновляются на Firebase БД третьей стороной (или даже на другом устройстве). Действительно, когда я запрашиваю 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. 11.
Когда я звоню getUser
, я получу оценку 5 (сначала запросить кеш Firebase), поэтому я не буду называть doSomething()
метод.
Если я раскомментирую код Thread.sleep()
из своего примера, кеш Firebase будет иметь достаточно времени для обновления, и мой getUser
вернет правильное значение оценки (11).
Итак, как я могу напрямую задать последнее значение непосредственно со стороны сервера и обойти кеш?
Также на: https://groups.google.com/forum/#!topic/firebase- talk/jFnO-QXKSwA –
См. http://stackoverflow.com/questions/34486417/firebase-offline-capabilities-and-addlistenerforsinglevalueevent, http://stackoverflow.com/questions/33260450/how-does-work-firebase-sync -w i-share-data и https://groups.google.com/forum/#!msg/firebase-talk/ptTtEyBDKls/XbNKD_K8CQAJ –
К сожалению, темы, которые вы опубликовали, не дают удобного ответа. Даже если я использую классический «addValueEventListener», у меня та же проблема, что и на «onDataChange (DataSnapshot data) {....}»: ** нет способа узнать, пришли ли данные из кеша или из сети, и, следовательно, если она обновлена **; так что невозможно доверие к значению данных при синхронном лечении. – toofoo