Android アプリ開発 「MATRIX」

Androidアプリの開発に役立つサンプル集



タイマーを使って1秒間隔でシステム時間を取得する方法

1秒間隔でシステム時間を取得

「Timer」関数を使うと一定の間隔で処理を繰り返し実行させることができるので便利です。しかし、毎回僅かな遅延(1000分の数秒ほど)が発生しているので注意が必要です。それは、繰り返しの回数が増えれば増えるほど誤差が大きくなるからです。

サンプルコード①(MainActivity.java

タイマーを使い1秒間隔でカウントをアップし、それと同時にシステム時間を取得してログに出力しています。 

    private double systemtime1;             // システム時間
private DecimalFormat decimalFormat1; // フォーマット用
private TextView textView1; // テキストビュー
private Handler handler1; // ハンドラー
private Timer timer1; // タイマー
private int count1; // カウント用

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//テキストビューを取得
textView1 = (TextView)findViewById(R.id.textview1);
//タイマーを新規生成
timer1 = new Timer();
//ハンドラーを新規生成
handler1 = new Handler();
//フォーマットを新規生成
decimalFormat1 = new DecimalFormat("0.000");
//カウンターを初期化
count1 = 0;

//タイマーに直接スケジュール(1秒後に1秒間隔の処理を開始)を追加して実行
timer1.schedule(new TimerTask() {
@Override
public void run() {
//システム時間を取得
systemtime1 = System.currentTimeMillis();
//"0.000"形式に成型してログに出力
Log.d("Sytem Time = ", decimalFormat1.format(systemtime1 / 1000) + "");
//直接だとエラーになるのでハンドラーを経由して画面表示を変更する
handler1.post(new Runnable() {
@Override
public void run() {
//レイアウトのテキストビューにカウント値を表示
textView1.setText(count1 + "");
}
});
//カウントアップ
count1 += 1;
}
}, 1000, 1000);
}

サンプルコード②(activity_main.xml

画面の中央にカウントを表示するテキストビューを配置したシンプルなレイアウトです。 

<TextView
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Timer"
android:textSize="30sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

実行結果①(ログ出力)

右端の数値が増えているので、毎回(1秒間隔)のように 1000分の数秒の遅れが発生しているというのがわかる。

f:id:vw-dsg:20180927192609p:plain

実行結果②(画面)

画面の中央の数値が1秒間隔でカウントアップするだけの構成。

f:id:vw-dsg:20180927192501p:plain

その他・備考

単純にカウントをアップして1/1000秒単位のストップウォッチを作ろうとタイマー処理の間隔を「1ms」に設定しても、毎回のように1000分の数秒の遅延が加算されているので1000回のカウントが1秒(1000ms)ということにはなりません。

簡単に一定の間隔で処理を実行できるタイマー機能ですが、毎回僅かな遅延が発生しているということを考慮して処理を考えなければなりませんね。 

END