Androidはシングルスレッドのため、GUI操作はmainスレッドで行われています。Timerを使用する場合には、別スレッドを儲け、Handlerを使用して、mainスレッドにアクセスする必要があります。
以下Timerのサンプルプログラムで説明をしていきます。スタートボタンを押すと、カウントが始まり、ストップボタンを押すとカウントが止まります。
public class TimerExample extends Activity implements OnClickListener{
TextView timeTextView;
Button btnStart;
Button btnStop;
private Handler mHandler;
private Timer mTimer;
private int count = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.timer_example);
//Setting TextView
timeTextView = (TextView) findViewById(R.id.time);
//Setting Button
btnStart = (Button) findViewById(R.id.btnstart);
btnStart.setOnClickListener(this);
btnStop = (Button) findViewById(R.id.btnstop);
btnStop.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v == btnStart){
if(mTimer != null) return;
count = 0;
mTimer = new Timer();
mHandler = new Handler();
mTimer.schedule(new TimerTask() {
public void run() {
mHandler.post(new Runnable() {
public void run() {
++count;
timeTextView.setText(String.valueOf(count));
}
});
}
},0, 1000);
}
if(v == btnStop){
if(mTimer == null) return;
mTimer.cancel();
mTimer = null;
}
}
}
Timer
Timerのメソッドでは、遅延や何秒間隔で繰り返すかなどを設定することができます。
1. Timerのインスタンス
まず最初にTimerのインスタンスを生成します。
mTimer = new Timer();
2. Timerのスケジュール設定
TimerTask()のインスタンスを生成し、遅延や何秒間隔で繰り返すか設定します。
mTimer.schedule(new TimerTask() {
...
},0, 1000);
TimerTask task: タイマースケジュールのためのタスク
long Delay: 最初の実行を行うまでの遅延時間(ms)
Period: 繰り返し実行の時間間隔(ms)
3. Timerのキャンセル
Timerとスケジュールされているタスクのキャンセル。現在実行中のタスクはキャンセルされません。
mTimer.cancel();
TimerTask
決められた時間間隔でタスクを実行します。
new TimerTask() {
public void run() {
...
}
}
Handler
Handlerによって、別スレッドからメインスレッドに通信をすることができます。ここではTimerが別スレッドになります。Timerからシグナルが来た時に、Runnable内のコードがメインスレッドとして実行されます。