2011年9月6日火曜日

定期処理ハンドラを用いて、Viewを再描画する

Androidでは、定期処理ハンドラを用いて、一定時間毎に処理を呼び出すことができます。
今回は、sleep()メソッドとHandleMessage()メソッドを用いたHandlerクラスを作成し、Viewの表示を一定時間毎に再描画することで、カウントアップを行うアプリについてご紹介します。

まず、定期処理の土台となる、Handlerクラスを継承したSampleHanlerクラスを作成します。
//定期処理ハンドラ
public class SampleHandler extends Handler {
}
Handlerクラスを継承することで、定期的な処理の実行が可能となります。
では、内部に定期的に実行したい処理を記述していきます。
まず、handleMessage()メソッドを記述してみます。
handleMessage()は、Handlerクラスが持つメソッドで、メッセージを受信することで起動します。
public class SampleHandler extends Handler {
@Override
public void handleMessage(Message msg) {
sampleView.invalidate(); //1.
}
}
1.で、invalidate()メソッドによってsampleViewの再描画を行っています。
次に、handleMessage()を起動するため、handleMessage()に対し、定期的にメッセージを送る必要があります。
では、定期的にメッセージを送信するsleep()メソッドを追加してみましょう。
Ex.)1
public class SampleHandler extends Handler {
@Override
public void handleMessage(Message msg) {
sampleView.invalidate(); //2.
if (sampleHandler!=null) sampleHandler.sleep(1000); //3.
}

//スリープメソッド
public void sleep(long delayMills) {
//使用済みメッセージの削除
removeMessages(0);
sendMessageDelayed(obtainMessage(0),delayMills); //4.
}
}
コード中の 3. でsleep()メソッドを呼び出しています。
sleep()メソッドでは、引数に指定された時間(ここでは1000ミリ秒)後に、メッセージを新たに取得し、送信しています(4.)。
あとは、以下のようにsampleHandlerのインスタンスを生成し、sleep()メソッドを実行すれば、その後は指定時間(1000ミリ秒)毎にhandleMessage()メソッドにメッセージが送られ、メソッドが実行されることになります。
@Override
public void onResume() {
super.onResume();
//定期処理ハンドラの生成と実行
sampleHandler=new SampleHandler();
sampleHandler.sleep(0);
}
また、定期処理ハンドラを停止したい場合は、以下のようにします。

sampleHandler=null;
アプリを中断、終了する際は、忘れずにこの処理を記述しましょう。

最後に、Ex.)1で使用したsampleView(2.)の中身は、以下のSampleViewのインスタンスです。
public class SampleView extends View {
private static int count = 0;

//コンストラクタ
public SampleView(Context context) {
super(context);
setBackgroundColor(Color.WHITE);
}

//描画
@Override
protected void onDraw(Canvas canvas) {
count++; //5.
//描画オブジェクトの生成
Paint paint=new Paint();
paint.setAntiAlias(true);
paint.setTextSize(30);

//Countの描画
canvas.drawText("Count>"+count,0,40*1,paint); //6.
}
}
SampleViewでは、onDraw()メソッドが呼び出される毎にCountを1ずつ加算し(5.)、Countの値を描画しています(6.)。
つまりEx.)1では、数字が約一秒ずつカウントアップされるような動きになります。
今回は、定期処理ハンドラを用いて、数値のカウントアップを行うアプリについて、ご説明しました。以上です。

0 件のコメント:

コメントを投稿