我正在使用/.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是连续的语句,它没有任何影响吗?
答案 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时间来获得服务器时间。