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インスタンスを確保しています。

こうすれば安全にタイマーを使用することが可能です。

関連項目
プライバシーポリシー