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
この記事のトラックバック用URL - http://mashi.exciton.jp/archives/37/trackback

mashi@exciton.jp