Android開発爆笑記

レセプターのソフト&ハード開発備忘録

Timerアプリ

Timerはscheduleメソッドで動く。

Timer.schedule(繰り返し実行したいクラスを実体化,その実体が初めて実行されるまでの時間,繰り返し間隔時間)となっている。

1.クラスの最初で変数宣言をする
private Timer mTimer;
private MainTimerTask mTimerTask;
private Handler mHandler = new Handler();
private TextView mText; //※4画面用の変数

2.onCreateの中でインスタンス(実体)を作る。※3
mTimer = new Timer();
mTimerTask = new MainTimerTask();

3.繰り返し実行したいクラスを作成する。
public class MainTimerTask extends TimerTask { // 下線部分がクラス名
    @Override
    public void run() {
        // ここに繰り返し間隔で行いたい処理を記述する。※1 ※2
    }
}

4.scheduleに設定する。※3開始と同時に始めたいときはonCreateの中で記述する。
mTimer.schedule( mTimerTask, 0, 1000); // すぐ実行の1秒間隔で処理を繰り返す

5.タイマー終了は※2内で記述されることが多い。cancelしたらTimerもタスク(繰り返し実行したいクラスの実体)を破棄するので、再開する際はそれぞれ実体を再度作ることが必要です。
mTimer.cancel();

※1.画面に何か表示するには
mHandler.post( new Runnable() {
    public void run() {
        // ここで画面用の変数※4に値を代入する
    }
});

 

以下サンプルコード

package com.receptorinc.android.test;
// タイマーアプリのテストプログラム
import java.util.Timer;
import java.util.TimerTask;

import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {

 private Timer mTimer;
 private MainTimerTask mTimerTask;
 private Handler mHandler = new Handler();
 private TextView mText;
 private Boolean isRun = false;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mText = (TextView)findViewById(R.id.txtTime);
    }

    public class MainTimerTask extends TimerTask {
  @Override
  public void run() {
   mHandler.post(new Runnable() {
    public void run() {
     mText.setText(mText.getText()+".");//
    }
   });
  }
     
    }
    public void startTimer(View v) {
     if (isRun)  { // 終了
      isRun = false;
      mTimer.cancel();
     } else { // 開始
      isRun = true;
            mTimer = new Timer();
            mTimerTask = new MainTimerTask();
         mTimer.schedule(mTimerTask, 0, 1000);
     }
    }
}