设备时间变更时如何刷新Firebase的/.info/serverTimeOffset?
解决Firebase服务器时间偏移量无法刷新的问题
我来帮你梳理下问题所在和可行的解决方案:
为什么连续调用goOffline()和goOnline()没触发回调?
你猜的没错,核心原因是这两个方法是异步执行的——连续调用时,Firebase可能还没完成离线操作,就立刻执行了上线操作,相当于跳过了完整的断开重连流程,自然不会重新获取服务器时间偏移量,也就不会触发你的ValueEventListener回调。
可行的解决方案
要确保触发完整的重连流程,你需要等待离线操作完成后,再执行上线操作。可以通过监听.info/connected节点来确认设备已离线:
// 先触发离线 FirebaseDatabase.getInstance().goOffline(); // 监听连接状态,确认离线后再重新上线 DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected"); connectedRef.addSingleValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { Boolean isConnected = snapshot.getValue(Boolean.class); if (isConnected != null && !isConnected) { // 确认已离线,执行上线操作 FirebaseDatabase.getInstance().goOnline(); } } @Override public void onCancelled(DatabaseError error) { // 处理错误情况,比如网络问题 clockSkew = null; } });
额外说明
.info/serverTimeOffset节点的值只会在初始连接或重连成功时更新,所以必须保证完成完整的断开-重连周期,才能获取到最新的偏移量。- 如果你担心重复监听的问题,可以在确认离线后移除这个
SingleValueEventListener,避免不必要的资源占用。
内容的提问来源于stack exchange,提问作者adarsh
相关产品推荐
相关产品推荐

