2013年10月4日金曜日

TimerとHandlerの連携

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内のコードがメインスレッドとして実行されます。

    0 件のコメント:

    コメントを投稿