2011年12月25日日曜日

JavaのTimerとTimerTaskの罠

Androidアプリで定期的に行う処理を起動するのに

java.util.Timer



java.util.TimerTask

を使用してハマった件のメモ。

スマホの時刻を手動で一時的に先の時刻に変更すると(例えば今8時だったら9時とか)、時刻を元に戻したときTimerがまったく動かなくなる!

どうもTimer、TimerTaskはシステムの時刻を元に次に処理を起動する時刻を決めて、その時刻になったら処理を呼び出すという動作のようだ。そのため一時的に未来の時刻になるとその時刻を元に次に起動する時刻を設定してしまう。時刻を元に戻すとその未来の時刻まではうんともすんとも言わなくなってしまうようだ。

まあActivityのような画面に表示されているときだけ動作するものにはそれでも良いのだが、Serviceのようなバックグラウンドでずっと動くものには要注意である。
そういう場合は

Executors.newSingleThreadScheduledExecutor()
等で

ScheduledExecutorService

を作成しましょう。これなら上記の問題は無いです。

0 件のコメント:

コメントを投稿