Android TimerTask 的简单应用

转载请标明出处:http://blog.csdn.net/xx326664162/article/details/53262707 文章出自:薛瑄的博客

android应用开发中常常会用到定时器,不可避免的需要用到 TimerTask 定时器任务这个类
下面简单的一个示例演示了如何使用TimerTask

Timer 的使用

在不同的场景下,需要使用不同的Timer接口。如上所说,主要区分两种情况

1) 在指定时间执行任务,只执行一次

  • public void schedule(TimerTask task, long delay)
  • public void schedule(TimerTask task, Date time)

2)从指定时间开始,周期性地重复执行,直到任务被cancel掉。其中又分两种类型:

2.1) 一种是按上一次任务执行的时间为依据,计算本次执行时间,可以称为相对时间法。比如,如果第一次任务是1分10秒执行的,周期为5秒,因系统繁忙(比如垃 圾回收、虚拟内存切换),1分15秒没有得到机会执行,直到1分16秒才有机会执行第二次任务,那么第3次的执行时间将是1分21秒,偏移了1秒。

  • public void schedule(TimerTask task, long delay, long period)
  • public void schedule(TimerTask task, Date firstTime, long period)

2.2) 另一种是绝对时间法,以用户设计的起始时间为基准,第n次执行时间为“起始时间+n*周期时间”。比如,在上面的情况下,虽然因为系统繁忙,第二执行时间被推后1秒,但第3次的时间点仍然应该是1分20秒。

  • public void scheduleAtFixedRate(TimerTask task, long delay, long period)
  • public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

这个示例演示了3秒未有触屏事件发生则锁屏,有触屏事件则解除锁定

public class ColTimerTaskActivity extends Activity {
    /** Called when the activity is first created. */

 private final String TAG = "ColTimerTaskActivity";
 private final int EVENT_LOCK_WINDOW = 0x100;

 private TextView textView;
 private Handler  mHandler;
 private Timer mTimer;
 private MyTimerTask mTimerTask;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        textView = (TextView)findViewById(R.id.textview);

        mHandler = new Handler(){
         public void handleMessage(Message message){
          Log.i(TAG, "message what = " + message.what);
           if (message.what == 0x100){
             lockWindow();
           }
          }
        };

        mTimer = new Timer(true);
        resumeWindow();
        StartLockWindowTimer();
    }

    public boolean onTouchEvent(MotionEvent event)
    {
      // TODO Auto-generated method stub
      resumeWindow();
      StartLockWindowTimer();

      return super.onTouchEvent(event);
    }

    public void resumeWindow(){
     textView.setText("main window");

    }

    public void lockWindow(){
     textView.setText("lock window");
    }

    public void StartLockWindowTimer(){
     if (mTimer != null){
      if (mTimerTask != null){
       mTimerTask.cancel();  //将原任务从队列中移除
      }


      mTimerTask = new MyTimerTask();  // 新建一个任务      
      mTimer.schedule(mTimerTask, 3000);
     }
    }

 class MyTimerTask extends TimerTask{
    @Override
    public void run() {
      // TODO Auto-generated method stub
      Log.i(TAG, "run...");
      Message msg = mHandler.obtainMessage(EVENT_LOCK_WINDOW);
      msg.sendToTarget();
    } 
  }
}

这里需要注意两个问题:

if (mTimerTask != null){
           mTimerTask.cancel();  //将原任务从队列中移除
 }

每次放定时任务前,确保之前任务已从定时器队列中移除

mTimerTask = new MyTimerTask();  // 新建一个任务      

每次放任务都要新建一个对象,否则出现这个错误:

 ERROR/AndroidRuntime(11761): java.lang.IllegalStateException: TimerTask is scheduled already

所以同一个定时器任务只能被放置一次

参考:
android TimerTask 的简单应用

Java:如何正确使用Timer【java定时器的使用(Timer) 】

关注我的公众号,轻松了解和学习更多技术
这里写图片描述

发布了244 篇原创文章 · 获赞 799 · 访问量 234万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503

分享到微信朋友圈

×

扫一扫,手机浏览