我们如何在设备时间更改时刷新/.info/serverTimeOffset?

时间:2018-05-10 17:49:28

标签: android firebase firebase-realtime-database

我正在使用/.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 :(得分:0)

处理我发现的情况的唯一方法是保持偏斜w.r.t elapsedRealtime,以便在设备时间变化时保持不变。

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

只要需要,可以通过将elapsedRealTime添加到clockSkewWRTElapsed时间来获得服务器时间。