Firebaseでオフライン接続を使用してサーバータイムスタンプを取得した結果は何ですか? null? (私は推測している)オフライン接続でサーバータイムスタンプを取得した結果
したがって、オフラインアプリケーションでは/.info/serverTimeOffsetの特別な場所が常に必要ですか?
Firebaseでオフライン接続を使用してサーバータイムスタンプを取得した結果は何ですか? null? (私は推測している)オフライン接続でサーバータイムスタンプを取得した結果
したがって、オフラインアプリケーションでは/.info/serverTimeOffsetの特別な場所が常に必要ですか?
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;
})
出力:
囲碁オンライン:
日2017年8月6日午前17時59分29秒GMT-0700(PDT): - 3270
オフライン:
日2017年8月6日夜五時59分39秒GMT-0700(PDT):-3270 日2017年8月6日夜5時59分43秒GMT-0700(PDT):-3270
オンライン戻ります:
日2017年8月6日午前17時59分55秒GMT-0700(PDT):-3269
は、だから、それが接続されている最後の瞬間から、キャッシュされた値を返すようです。
実際の作業バージョンについては、this jsbinを参照してください。
私はこのコードのビットを書いた:
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);
オフラインで実行すると、それは別の1〜2秒後に設定し、その後、タイムスタンプを設定します。リスナーは毎回起動し、タイムスタンプの値は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 }
:あなたは、ログの第3対のオンライン同期後より、見かけ上のタイムスタンプの差が見ることができます。
サーバーのタイムスタンプをオフラインの場所に書き込んでから、オフラインの間にもう一度サーバーのタイムスタンプを読み取ろうとするとどういうことでしょうか?一度その値が同期されると、それは特別なサーバータイムスタンプであったという記録がなくても常に数字になるためです。 –
私は、サーバーのタイムスタンプによってrecyclerview内のアイテムを注文しています。しかし、ソートはオフライン接続では機能していないようです。接続状態に変更すると、アイテムをよく注文します。だから、何も起こっていないような結局のところタイムスタンプを取得しても結果はありません。 - Doug Stevenson – aaabc