<< Android-Note
Timerで一定時間ごとにタスクを実行する方法
1秒ごとなど決められた間隔で同じタスクを実行したい場合はTimerクラスを使用します。
例としてタスク開始ボタンを押したらタイマーを設定し、タスク終了ボタンを押したらタイマーをストップさせるには次のようなコードを次に紹介します。
public class MainActivity extends FragmentActivity { Timer timer; //タスクを実行するタイマー private final String LOG_TAG = "MainActivity : "; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); timer = new Timer(); Button timerStartButton = (Button) findViewById(R.id.timerStartButton); //タイマーを開始するボタン Button timerCancelButton = (Button) findViewById(R.id.timerCancelButton); //タイマーをキャンセルするボタン timerStartButton.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { timer.scheduleAtFixedRate( new TimerTask() { @Override public void run() { Log.i(LOG_TAG, "Task called."); } }, 10, 100); //10ミリ秒後に100ミリ秒間隔でタスク実行 } }); timerCancelButton.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { timer.cancel(); Log.i(LOG_TAG, "Timer canceld."); timer = new Timer(); } }); } }
TimerクラスのscheduleAtFixedRateメソッドに実行したタスクとしてTimerTaskインスタンスを開始時間(ミリ秒)と間隔(ミリ秒)とともに渡します。
すると指定した間隔秒ごとにタスクが実行されて、cancelメソッドが呼び出されない限り、タスクが実行され続けます。
注意点
cancelメソッドでタスクを終了した場合は次の点に注意する必要があります。
- スケジュールされていたすべてのタスクを中止する。
- 中止された時点で現在実行中のタスクには影響しない(中止されない)。
- タスクだけでなくタイマーも破棄される。
重要なことは3つ目のタイマーも破棄されるということなので一旦cancelメソッドを呼び出したら同じインスタンスでタスクを実行することはできなくなります。もし再びタスクをスケジュールしようとするとIllegalStateExceptionが発生してしまいます。
そこで紹介した例ではcancelしたタイマーを再利用するためにTimerインスタンスを確保しています。
こうすれば安全にタイマーを使用することが可能です。
© Kaz