Android 线程Timer与TimerTask Demo

本章节接着  Android 线程Timer与TimerTask初涉  创建Demo


一.schedule方法使用


1. 

private Timer timer;

private int count=0;



2.

timer=new Timer();

timer.schedule(new MyTimerTask(),5000,2000);//延时5秒执行 每2秒执行一次


3.

/**
     * TimerTask实现类 重写run方法
     * */


private class MyTimerTask extends TimerTask{

        @Override

        public void run() {//正式使用 一般Handler通讯

            count++;

            Log.d("TAG","延时2秒执行 每3秒执行一次----count:"+count);

        }

 }



4.

@Override

 protected void onDestroy() {

       super.onDestroy();

       if(null!=timer){//取消定时器

            timer.cancel();//取消定时器

            Log.d("TAG","取消定时器!!!");

        }

  }


5.

Android 线程Timer与TimerTask Demo


6.将

2中timer.schedule(new MyTimerTask(),5000,2000);//延时5秒执行 每2秒执行一次

换成

SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String string="2018-05-30 09:28:30";

try {

     Date date=simpleDateFormat.parse(string);

     timer.schedule(new MyTimerTask(),date,2000);//string执行 每2秒执行一次

     Log.d("TAG","当前时间----:"+new Date().toLocaleString()+"----任务时间:"+date.toLocaleString());

 } catch (ParseException e) {

            e.printStackTrace();

 }


Date 时间即指定执行时间(晚于当前时间) 

任务会等待到指定的时间,指定时间一到任务就开始执行。


7.

Android 线程Timer与TimerTask Demo



8.Date 时间即指定执行时间(早于当前时间)

   任务会立刻执行

Android 线程Timer与TimerTask Demo



二.任务队列清除

1.TimerTask任务队列是排队运行的,下面讲述如何清除任务队列

这里用到cancel方法,而TimerTask和Timer都有cancel的方法。


2.TimerTask.cancel():将自身从任务队列中清除

timer=new Timer();
timer.schedule(new MyTimerTask1(),5000,2000);//延时5秒执行 每2秒执行一次

timer.schedule(new MyTimerTask2(),5000,2000);//延时5秒执行 每2秒执行一次



private class MyTimerTask1 extends TimerTask{

     @Override

     public void run() {//正式使用 一般Handler通讯

          count++;

    Log.d("TAG","MyTimerTask111开始执行运行时间----:"+new Date().toLocaleString()+"----count:"+count);

         this.cancel();

    }

}


private class MyTimerTask2 extends TimerTask{

     @Override

     public void run() {//正式使用 一般Handler通讯

         count++;

    Log.d("TAG","MyTimerTask222开始执行运行时间----:"+new Date().toLocaleString()+"----count:"+count);

    }

}


Android 线程Timer与TimerTask Demo

可以看出MyTimerTask1执行了自己的cancel方法,而MyTimerTask2没有执行自己的cancel方法,所以MyTimerTask1的run方法执行了一次就不再执行,而MyTimerTask2则循环执行。


3.Timer.cancel():将任务队列中的全部任务清空

if(null!=timer){//取消定时器

    timer.cancel();//取消定时器

}

Android 线程Timer与TimerTask Demo



三.schedule方法与scheduleAtFixedRate方法区别

1.

timer=new Timer();

timer.schedule(new MyTimerTask1(),5000,2000);//延时5秒执行 每2秒执行一次

Android 线程Timer与TimerTask Demo


timer=new Timer();

timer.scheduleAtFixedRate(new MyTimerTask1(),5000,2000);//延时5秒执行 每2秒执行一次

Android 线程Timer与TimerTask Demo


也就是说都用long l1,long l2参数时没区别。


2.

timer=new Timer();

SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

       

String string="2018-05-30 10:32:30";

       

 try {

         Date date=simpleDateFormat.parse(string);

         timer.schedule(new MyTimerTask1(),date,2000);//string执行 每2秒执行一次

  Log.d("TAG","当前时间----:"+new Date().toLocaleString()+"----任务执行时间:"+date.toLocaleString());

  } catch (ParseException e) {

       e.printStackTrace();

  }

Android 线程Timer与TimerTask Demo

timer=new Timer();

SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String string="2018-05-30 10:36:30";

       

try {

     Date date=simpleDateFormat.parse(string);

     timer.scheduleAtFixedRate(new MyTimerTask1(),date,2000);//string执行 每2秒执行一次

 Log.d("TAG","当前时间----:"+new Date().toLocaleString()+"----任务执行时间:"+date.toLocaleString());

} catch (ParseException e) {

      e.printStackTrace();

 }


Android 线程Timer与TimerTask Demo


也就是说都用Date date,long l参数时 date晚于当前时间也没区别。



3.过一会在执行使以上2018-05-30 10:32:30  2018-05-30 10:36:30 过时再分别运行

schedule

Android 线程Timer与TimerTask Demo

scheduleAtFixedRate

Android 线程Timer与TimerTask Demo

Android 线程Timer与TimerTask Demo



也就是说当设定的时间早于当前时间时就有区别了。

schedule方法:如果执行任务的时间没有被延时,那么下次任务的执行时间是参考上一次任务的开始时间来计算的。


scheduleAtFixedRate方法:如果执行任务的时间没有被延时,那么下次执行任务的时间是参考上一次任务的结束时间来开始计算的。