使用脱机连接检索Server TimeStamp的结果是什么

时间:2017-08-07 00:41:46

标签: android firebase firebase-realtime-database

在Firebase中使用脱机连接检索Server TimeStamp的结果是什么? 空值? (我猜)

所以离线应用程序总是需要使用/.info/serverTimeOffset上的特殊位置吗?

2 个答案:

答案 0 :(得分:0)

JavaScript中的快速测试:

var ref = firebase.database().ref("/.info/serverTimeOffset");

document.querySelector("#getOffset").addEventListener("click", function(e) {
  e.preventDefault();
  ref.once('value',function(snapshot) {
    var li = document.createElement("li");
    li.innerText = new Date().toString()+": "+snapshot.val();
    document.querySelector("#offsets").appendChild(li);
  });
  return false;
})

输出:

上网:

  

Sun Aug 06 2017 17:59:29 GMT-0700(PDT): - 3270

离线:

  

Sun Aug 06 2017 17:59:39 GMT-0700(PDT): - 3270   Sun Aug 06 2017 17:59:43 GMT-0700(PDT): - 3270

回到网上:

  

Sun Aug 06 2017 17:59:55 GMT-0700(PDT): - 3269

所以它似乎从它连接的最后一刻返回缓存的值。

有关实际工作版本,请参阅this jsbin

答案 1 :(得分:0)

我写了这段代码:

final DatabaseReference ref = FirebaseDatabase.getInstance().getReference("foo");
ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Log.d("TAG", "system time " + System.currentTimeMillis());
        Log.d("TAG", "snap " + dataSnapshot);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
});
ref.setValue(ServerValue.TIMESTAMP);
new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        ref.setValue(ServerValue.TIMESTAMP);
    }
}, 2000);

当离线运行时,它将设置一个时间戳,然后在两秒钟后再设置一个时间戳。侦听器每次都会触发,时间戳的值将与System.currentTimeMillis()的系统时间匹配(或几乎完全匹配)。

然后,当设备上线时,该值将同步,并且它将与本地时间显示出更多不同(因为实际的服务器时间终于开始了)。

这是日志的样子。您可以看到第三对日志在线同步后具有更明显的时间戳差异:

D/TAG: system time 1502071462035
D/TAG: snap DataSnapshot { key = foo, value = 1502071462001 }
D/TAG: system time 1502071463993
D/TAG: snap DataSnapshot { key = foo, value = 1502071463993 }
D/TAG: system time 1502071511215
D/TAG: snap DataSnapshot { key = foo, value = 1502071511650 }

最重要的是,如果您读取脱机时写入的服务器时间戳,则应该获取客户端时间戳。