Как обновить /.info/serverTimeOffset при изменении времени устройства? - PullRequest
0 голосов
/ 10 мая 2018

Я использую /.info/serverTimeOffset для получения приблизительного времени сервера из firebase.

Long clockSkew = null;
...
void registerForClockSkew() {
  DatabaseReference offsetRef = 
  FirebaseDatabase.getInstance().getReference(".info/serverTimeOffset");
  offsetRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
      double offset = snapshot.getValue(Double.class);
      clockSkew = (long) offset;
    }

    @Override
    public void onCancelled(DatabaseError error) {
      clockSkew = null;
    }
  });
}

Однако, как уже упоминалось здесь - https://github.com/firebase/firebase-ios-sdk/issues/363 - смещение не обновляется при изменении времени устройства. Я попытался закрыть и повторно подключить экземпляр firebase, чтобы обновить значение перекоса, но, похоже, оно не работает. В моем коде я просто вставляю следующее при изменении времени устройства -

FirebaseDatabase.getInstance().goOffline();
FirebaseDatabase.getInstance().goOnline();

но это не вызывает обратный вызов value-event-listener. Что мне здесь не хватает? Это потому, что goOffline и goOnline являются последовательными утверждениями, это никак не влияет?

1 Ответ

0 голосов
/ 21 мая 2018

Единственный способ справиться с обнаруженной мною ситуацией состоит в том, чтобы сохранить наклон elapsedRealtime, который остается постоянным в случае изменения времени устройства.

long clockSkewWRTELapsed
....
    @Override
    public void onDataChange(DataSnapshot snapshot) {
      double offset = snapshot.getValue(Double.class);
      clockSkewWRTELapsed = ((long) offset) + System.currentTimeMillis() - SystemClock.elapsedRealTime();
    }

При необходимости можно получить серверное время, добавив elapsedRealTime к времени clockSkewWRTElapsed.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...