AndroidのUIスレッドTimer

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