今日も android で遊んでました。
現在考えているプログラムで、100msくらいの単位で処理&画面更新を行いたかったので、その方法を調べてみました。
android のリファレンスをみると、java.util.Timer あたりが使えそうだったので、それに目星をつけてみました。
というわけで、簡単なテストアプリを作って試してみました。
テストアプリの仕様
テストアプリというわけで、タイマーの動作が分かるような感じで下記のようにしてみました。
- 100msごとにint tickcount 値をカウントアップ
- 画面に、int tickcount 値を表示
まあ、タイマの動作確認としては必要最低限ですね。
必要な情報
タイマを動かすためにイロイロ調べた情報&Try and Error でうまくいった処理をまとめときます。
ネットで調べた情報が主ですが、中には自己解釈なども含まれています。
とりあえず、このように解釈したらうまく動いた、と言うことなので参考程度にしておいて下さい。
- java.util.Timerで定期的なタイマー処理を起動できる。
- タイマー処理の実態は、android.os.Handler を用いて実装する。
- java.util.Timer
-
- コンストラクタのTimer()には引数をtrueにする。そうすると、daemon thread.として動くようだ。
- schedule()で実行する処理と起動感覚を設定。
-
- long delay は初回起動時の遅延時間。単位はms(ミリ秒)
- long periodは起動間隔。単位はms(ミリ秒)
- taskには実行する処理を記述。ここでandroid.os.Handler に Runnable なオブジェクトを登録する。
- android.os.Handler
-
- まずはインスタンス化しておく。
- post()で行いたい処理を登録。これでキューに登録されるようだ。
- postに登録する処理は TimerTask::run() の中で Runnnable::run()を生成してそこで実装する。
実行結果
カウント値が100msごとに上がっていく様子が分かります。
ちゃんとカウントアップしてます。
だいたい、1秒で10カウント増えています。期待通りです。
ソースコード
見よう見まねで作ったコードです。
とりあえず、期待した処理は動いているようです。
後生のためにここに書き残しておきます。
package jp.hews.testforcyclicprocess;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;public class TestForCyclicProcess extends Activity {
/** Called when the activity is first created. */
int tickcount;
Timer timer = null; //タイマを定義
TextView mDisplayText; //表示領域の定義@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//結果の表示先を設定
mDisplayText = (TextView)findViewById(R.id.text_view);
//カウント値の初期化
tickcount = 0;
//Timerを設定する
timer = new Timer(true);
final android.os.Handler handler = new android.os.Handler();
timer.schedule(
new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
handler.post( new Runnable(){
public void run(){
//結果出力用のテキストボックス
tickcount++;
StringBuffer buff = new StringBuffer();
buff.append("now tick:");
buff.append(tickcount);
mDisplayText.setText(buff.toString());
}
});
}
}, 1000, 100); //初回起動の遅延と周期指定。単位はms
}
}

