2017-08-07 1 views
0

Firebaseでオフライン接続を使用してサーバータイムスタンプを取得した結果は何ですか? null? (私は推測している)オフライン接続でサーバータイムスタンプを取得した結果

したがって、オフラインアプリケーションでは/.info/serverTimeOffsetの特別な場所が常に必要ですか?

+0

サーバーのタイムスタンプをオフラインの場所に書き込んでから、オフラインの間にもう一度サーバーのタイムスタンプを読み取ろうとするとどういうことでしょうか?一度その値が同期されると、それは特別なサーバータイムスタンプであったという記録がなくても常に数字になるためです。 –

+0

私は、サーバーのタイムスタンプによってrecyclerview内のアイテムを注文しています。しかし、ソートはオフライン接続では機能していないようです。接続状態に変更すると、アイテムをよく注文します。だから、何も起こっていないような結局のところタイムスタンプを取得しても結果はありません。 - Doug Stevenson – aaabc

答えて

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; 
}) 

出力:

囲碁オンライン:

日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を参照してください。

+0

答えに感謝、それは非常に有用です@フランクヴァンPuffelen。サーバーのタイムスタンプは、特別な場所を使用する代わりに、ストレージに保存されません私のアプリが必要なものです。 – aaabc

+0

@FrankVanPuffelen、Firestoreのタイムスタンプのおおよその値を取得するには、 'firestore.collection(" /。info/serverTimeOffset ")'を聞くべきですか? – rgoncalv

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); 

オフラインで実行すると、それは別の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対のオンライン同期後より、見かけ上のタイムスタンプの差が見ることができます。

関連する問題