[Android] ターマーやストップウォッチをSystem.currentTimeMillis() で作成するには

System.currentTimeMillis()を使って、ミリ秒でカウントするストップウォッチ・タイマーを作ってみます。TimerTaskを使ったカウントアップタイマーと同じようにrun()やHandlerのpostを使います。

1x1.trans - [Android] ターマーやストップウォッチをSystem.currentTimeMillis() で作成するには

Android Studio
2021.2.1




System.currentTimeMillis()

 
java.lang.System.currentTimeMillis() は
ミリ秒で表される現在の時間を返します
Ref: currentTimeMillis() – java.lang.System クラス

これを使って

カウント時間 = 経過時間 – 開始時間

という形でタイマーを作ります

計測間隔は
public static void sleep(long millis) throws InterruptedException
を使って
Thread.sleep(10);
のようにミリ秒のウェイトをかけて表示させるようにします
但し、これはパフォーマンスに影響する可能性があるので長時間の計測はやめたほうがいいかもしれません。
 

 

ミリsecから 分:秒.ミリ秒 へ変換

 
時間の表示を [分:秒.ミリ秒] で表現したいときには
SimpleDateFormatを使うと簡単です
ミリ秒で表されるmillisecがあるとすると、分:秒.ミリ秒(2桁)


但し、これは時刻を表示するものを便宜的に使ったのでLocaleの設定をしないとWarningが出ます。
年月日も追加してみるとわかりますが、startしてからの時間計測はこの例では、起点である1970/1/1からの時間ということになってしまいます。
あるいは、以下のように計算でも出せます。


今回は簡単にSimpleDateFormatを使います。

 

サンプルコード

 
以上の事を踏まえて簡単なサンプルを作ってみましょう。
MainActivity.java


 
レイアウトは
activity_main.xml


 
リソースです
strings.xml


 
1x1.trans - [Android] ターマーやストップウォッチをSystem.currentTimeMillis() で作成するには

 

ミリsecの表示について考察

 
ミリ秒の1の位まで表示させたいのですが、エミュレータでは10の位で切られています

System.currentTimeMillis()の精度はPCに依存して10msec以下は測定できない場合もあるようです
java.lang.System クラス

検証のためsleepを7msecでLogを取ってみると

private int period = 7;
Log.d(“time”, String.valueOf(endTime));

Emyulator:


10msecで切られていて、かつ間隔は20msecとなっています

Nexus7:


ミリsecのオーダーで数値が出ていますが
間隔は10msec以上もありバラバラです

この場合は見た目はmsecまで出ているのでいいのですが
負荷が大きいと思われます

System.currentTimeMillis()の他に
System.nanoTime()があります

使い方が良ければより精度が高くできるかもしれませんが
実際は色々問題もあるのないのという話もあります

タイマー関連:

シェアする

  • このエントリーをはてなブックマークに追加

フォローする