4

タイマーを実装しようとしています。短い (秒) イベントまたは長い (時間など) イベントに使用できます。

理想的には、CPU がオフになっている間 (バッテリーが切れたときなど) に持続する必要があります。System.currentTimeMillis() を使用して開始時刻を設定し、同じ関数を使用して終了時刻を設定すると、うるう秒、うるう年、夏時間の変更などの期間を除いて、ほとんどすべての場合に機能します...または、ユーザーは時間を変更するだけです(私はこれを確認しました)。これは Android システム上にあります。

代わりに、System.nanoTime() を使用した場合、より正確になる可能性があることに加えて、時間の変更などに伴う通常の「苦労」の問題はありません。私の質問は、System.nanoTime() は「つらい時」の任意の時間?適切な用語が何であるかはわかりませんが、たとえば、System.nanoTime() が X で実行され、X+1 時間後にシステムがオフになり (たとえば、Android デバイスのバッテリーが切れた場合)、次に X になります。 +10 時間、システムが起動します。この時点で System.nanoTime() を実行すると 10 時間が返されますか? または、1 時間を返します (システムがオフ/スリープ状態のときに nanoTime が使用する「カウンター」が実行されていない可能性があるため)。

4

2 に答える 2

2

android.os.SystemClock.elapsedRealtime() - スリープ状態で費やされた時間を含む、システムが起動してからのミリ秒。これが最善の策です。

Androidでスイッチオフ時間を測定できるとは思いません。

詳細については、Android システム クロック ページを確認することをお勧めします。http://developer.android.com/reference/android/os/SystemClock.html

于 2012-06-18T22:30:55.247 に答える
1

それは未定義です:

「返される値は、固定されているが任意の起点時刻からのナノ秒を表します (おそらく将来であるため、値は負の可能性があります)。同じ起点が、Java 仮想マシンのインスタンスでのこのメソッドのすべての呼び出しで使用されます。他の仮想マシン インスタンス。別の起源を使用する可能性があります。」

簡単にするために、時間 X に実行すると、原点は X であるとします (これは許可されます)。つまり、0 が返され、VM インスタンス内では通常の時計と同じ速度で時間が経過します。

を使用するThread.sleepと、VM インスタンスは変更されないため、特別に扱われません。

ただし、デバイスを再起動すると、別の VM インスタンスになります。したがって、X が原点であるとは限りません。

于 2012-06-18T22:14:19.850 に答える