2017-01-20 12 views
2

システム時間が変更されたときにタイマーを実行するとどうなりますか?システム時刻が変更されたときにタイマーを実行するとどうなりますか?

私はアンドロイドアプリケーションを持っていて、インターバルの終わりに呼び出されるRunnable(run()メソッド)をポストするためにhandler.postDelayed(Runnable、interval)を使用します。

私が持っている質問は次のとおりです。 基本的なシステム時間が外部で変更されるとどうなりますか? 私の印象は、ポスティングはまだ起こるということですが、システム時間の変更時にカウントダウンが再び始まります。誰かがここでいくつかの光を遮ることができますか?

時間の変更が前方または後方の場合、動作が変更されますか?

+1

なぜあなたはそれを試してみませんか? –

+0

本当の答えを読んだ後、私はテストをしました。時間を逆方向に設定しようとしました –

+0

私はこの特定のケースでテストを設定するのは簡単ではないので、質問しました。 「本当の」回答を読んだ後、私はそれをテストする時間を費やす価値があると判断し、DibzmaniaとBaoyangの両方が正しいと私はBaoyangの答えの完全性に感謝します。私はシステム時間が前後に移動するケースをテストし、handler.postDelayed()は一貫して変更を無視しました。 –

答えて

1

まず、HandlerSystemClock.uptimeMillis()を基にしている必要があります。例えばsendMessageDelayedとして Handler S sendMessageXXX()メソッド、sendEmptyMessage全ては、内部の下方方法を使用します。

//calcute the milliseconds we hope to handle the message since the system was booted 
sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis) 

そして、時間間隔値SystemClock.uptimeMillis() + delayMillisMessageのフィールドwhenに保持され、我々は中にメッセージを入れますLooperがそれをポーリングするのを待つ。MessageQueue

ルーパーはキューから次のメッセージを取得する間に、と比較して、メッセージが準備完了であるかどうかを判断します。次のメッセージが準備できない場合、msgが準備完了するまでタイムアウトします。システムが起動してから

  • SystemClock.uptimeMillis()はミリ秒単位でカウントされます。

    第二に、あなたは.Below、2つの概念を説明しSystemClockのマニュアルの一部ですSystemClock.uptimeMillis()System.currentTimeMillis()と混同します。このクロックは、システムが深いスリープ(CPUがオフ、暗いディスプレイ、デバイスが外部入力を待っている)に入ったときに停止しますが、クロックスケーリング、アイドル、または他の省電力メカニズムの影響を受けません。これは、Thread.sleep(millls)、Object.wait(millis)、System.nanoTime()などのほとんどのインターバルタイミングの基礎となります。このクロックは単調であることが保証されており、インターバルがデバイススリープをまたいでいない場合、インターバルタイミングに適しています。

  • System.currentTimeMillis()は、エポックからのミリ秒を表す標準的な「壁」クロック(時間と日付)です。ウォールクロックは、ユーザまたは電話ネットワーク(setCurrentTimeMillis(long)を参照)によって設定できるので、時間が予測できないほど前後にジャンプすることがあります。この時計は、カレンダーや目覚まし時計アプリケーションなど、実際の日時との対応が重要な場合にのみ使用してください。インターバル時間または経過時間の測定には、異なるクロックを使用する必要があります。 System.currentTimeMillis()を使用している場合は、ACTION_TIME_TICK、ACTION_TIME_CHANGED、ACTION_TIMEZONE_CHANGEDインテントブロードキャストを聴取して、時間の変化を知ることを検討してください。
1

いいえ問題ありません。コードを掘る場合、遅延は次のメカニズムによって提供されます -

SystemClock.uptimeMillis() + delayMillis 

これは純粋に相対的なものです。システム時間の変更は影響しません。

関連する問題