Androidでは、定期処理ハンドラを用いて、一定時間毎に処理を呼び出すことができます。
  今回は、sleep()メソッドとHandleMessage()メソッドを用いたHandlerクラスを作成し、Viewの表示を一定時間毎に再描画することで、以下の画像のようなカウントアップを行うアプリについてご紹介します。
  では、続きをどうぞ。
  Handlerクラス
  まず、定期処理の土台となる、Handlerクラスを継承したSampleHanlerクラスを作成します。
  | 1 2 3 | //定期処理ハンドラpublicclassSampleHandler extendsHandler         {} | 
Handlerクラスを継承することで、定期的な処理の実行が可能となります。
  では、内部に定期的に実行したい処理を記述していきます。
  まず、handleMessage()メソッドを記述してみます。
  handleMessage()は、Handlerクラスが持つメソッドで、メッセージを受信することで起動します。
  | 1 2 3 4 5 6 | publicclassSampleHandler extendsHandler         {           @Override           publicvoidhandleMessage(Message         msg) {               sampleView.invalidate(); //1.           }} | 
1.で、invalidate()メソッドによってsampleViewの再描画を行っています。
  次に、handleMessage()を起動するため、handleMessage()に対し、定期的にメッセージを送る必要があります。
  では、定期的にメッセージを送信するsleep()メソッドを追加してみましょう。
  Ex.)1
  | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | publicclassSampleHandler extendsHandler         {            @Override            publicvoidhandleMessage(Message         msg) {                sampleView.invalidate();  //2.                if(sampleHandler!=null) sampleHandler.sleep(1000);  //3.            }            //スリープメソッド            publicvoidsleep(longdelayMills)         {                //使用済みメッセージの削除                removeMessages(0);                sendMessageDelayed(obtainMessage(0),delayMills);  //4.            }} | 
コード中の   3. でsleep()メソッドを呼び出しています。
  sleep()メソッドでは、引数に指定された時間(ここでは1000ミリ秒)後に、メッセージを新たに取得し、送信しています(4.)。
  あとは、以下のようにsampleHandlerのインスタンスを生成し、sleep()メソッドを実行すれば、その後は指定時間(1000ミリ秒)毎にhandleMessage()メソッドにメッセージが送られ、メソッドが実行されることになります。
  | 1 2 3 4 5 6 7 | @OverridepublicvoidonResume()         {            super.onResume();            //定期処理ハンドラの生成と実行            sampleHandler=newSampleHandler();            sampleHandler.sleep(0);} | 
また、定期処理ハンドラを停止したい場合は、以下のようにします。
| 1 | sampleHandler=null; | 
アプリを中断、終了する際は、忘れずにこの処理を記述しましょう。
最後に、Ex.)1で使用したsampleView(2.)の中身は、以下のSampleViewのインスタンスです。
  | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | publicclassSampleView extendsView         {            privatestaticintcount = 0;            //コンストラクタ            publicSampleView(Context         context) {                super(context);                setBackgroundColor(Color.WHITE);            }            //描画            @Override            protectedvoidonDraw(Canvas canvas)         {                count++;  //5.                //描画オブジェクトの生成                Paint paint=newPaint();                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 件のコメント:
コメントを投稿