AndroidのUIスレッドTimer
Posted in Android
Androidでポップアップウィンドウとか出した時に、数秒後に閉じるみたいなことって結構あるけど、
普通のTimerで↓みたいにやるとうまく行かない。
new Timer(true).schedule(new TimerTask() { @Override public void run() { hidePopupWindow(); } }, delay);
Activityに属するウィジェットの表示なんかを変更しようとする場合は
Handlerを通じてUIスレッドから実行しないといけない。
んだもんだから、下記のようなコードになる
final Handler handler = new Handler(); new Timer.schedule( new TimerTask(){ @Override public void run() { handler.post( new Runnable() { public void run() { hidePopupWindow(); } }); } }, delay);
hidePopupWindow()したいだだけなのにずいぶんと大げさなコードになっちゃう。
こりゃいかん!
ということでUIスレッドタイマー作った!
public class UITimer { private Timer timer; public UITimer(final Runnable run, long delay){ this(run, delay, 0L); } public UITimer(final Runnable run, long delay, long period){ timer = new Timer(true); TimerTask task = new TimerTask() { @Override public void run() { new Handler().post(run); } }; if(period > 0){ timer.schedule(task, delay, period); }else{ timer.schedule(task, delay); } } public void cancel(){ if(timer != null) timer.cancel(); } }
使い方はこんな感じ。
どや、これでかんたんやろ!
new UITimer(new Runnable() { @Override public void run() { hideUndoPopup(); } },3000);
あぁ、関数ポインタが欲しくなってくる、、、、
=====================
TimerやTimerTaskを使わないで
Handlerだけで実現する方法もあるようです。
[AndroidでタイマーからUIを操作するAdd Star]
http://d.hatena.ne.jp/seinzumtode/20130504/1367662040
[…] これ作りながら、ちょっと気になったものを記事にしてたりしたので、 AndroidのUIスレッドTimerとか PendingIntentとAlermManagerとか あと今回ユニットテストもやったので、AndroidをUnitTestする の […]