最終更新:
moonlight_aska 2011年05月28日(土) 09:33:58履歴
タスクを定期的(一定間隔)で実行したい場合, タイマー(Timer)クラス及びタイマータスク(TimerTask)クラスを使用する.
一定間隔を決定するための基準時間の違いにより, 2通りのメソッドが準備されている.

一定間隔を決定するための基準時間の違いにより, 2通りのメソッドが準備されている.
- scheduleメソッド : 直前のタスクの実行開始時刻を基準とし, 周期(msec)後に次のタスクを実行しようとする.

- scheduleAtFixedRateメソッド : 最初のタスクの実行開始時刻を基準とし, n回目に実行されるタスクは周期×(n-1) (msec)後に実行しようとする.

scheduleメソッドで説明するが, scheduleAtFixedRateメソッドでも同じである.

- ウィジェットの属するスレッドで, Handlerのインスタンスを生成する.
- Timerのインスタンスを生成する.
- Timer.scheduleメソッドで, 初回起動の遅延時間(msec)及び周期(msec)を引数に渡し, タスクを設定する.
- Handler.postメソッドで, ウィジェットにアクセスするコードを記述したRunnableクラスを指定する.
package com.moonlight_aska.android.schedule01;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
public class Schedule01 extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyView view = new MyView(getApplication());
setContentView(view);
}
}
class MyView extends View {
private final static int TIMER_PERIOD = 1000;
ArrayList<String> taskLogs = new ArrayList<String>();
private long prevTime = 0;
private int taskCnt = 0;
// ハンドラを生成
Handler handler = new Handler();
public MyView(Context context) {
super(context);
// TODO Auto-generated constructor stub
// タイマーを生成
Timer timer = new Timer(false);
// スケジュールを設定
timer.schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
handler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
// 描画処理を指示
invalidate();
}
});
}
}, 5000, TIMER_PERIOD); // 初回起動の遅延(5sec)と周期(1sec)指定
}
// invalidate()により, 定期的にコールされる
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
canvas.drawColor(Color.WHITE);
Paint paint = new Paint();
paint.setColor(Color.BLUE);
long currTime = System.currentTimeMillis();
String log = new String(taskCnt + " : " + String.valueOf(currTime));
if(taskCnt > 0) {
log += ", dt = " + String.valueOf(currTime - prevTime);
}
taskLogs.add(log);
prevTime = currTime;
taskCnt++;
for(int i=0; i<taskLogs.size(); i++) {
canvas.drawText(taskLogs.get(i), 20, (i+1)*20, paint);
}
super.onDraw(canvas);
}
}

コメントをかく