C/C++プログラマの管理者が, Androidプログラムにチャレンジ. AndroidプログラミングのTipsをメモっていく予定です.

タスクを定期的(一定間隔)で実行したい場合, タイマー(Timer)クラス及びタイマータスク(TimerTask)クラスを使用する.
一定間隔を決定するための基準時間の違いにより, 2通りのメソッドが準備されている.
  • scheduleメソッド : 直前のタスクの実行開始時刻を基準とし, 周期(msec)後に次のタスクを実行しようとする.
  • scheduleAtFixedRateメソッド : 最初のタスクの実行開始時刻を基準とし, n回目に実行されるタスクは周期×(n-1) (msec)後に実行しようとする.


タスクを定期的に実行する.

scheduleメソッドで説明するが, scheduleAtFixedRateメソッドでも同じである.
    • ウィジェットの属するスレッドで, Handlerのインスタンスを生成する.
    • Timerのインスタンスを生成する.
    • Timer.scheduleメソッドで, 初回起動の遅延時間(msec)及び周期(msec)を引数に渡し, タスクを設定する.
    • Handler.postメソッドで, ウィジェットにアクセスするコードを記述したRunnableクラスを指定する.
注) AndroidアプリのUIはシングル・スレッドモデルであり, 別スレッドからUIを操作すると例外が発生する.
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);
  }
}





コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu


逆引き(基礎編)

画面表示/操作(49)

フラグメント(1)

逆引き(応用編)

Firebase(2)

AD



管理人/副管理人のみ編集できます