1,介绍:
【1】Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。
【2】在Android平台中需要反复按周期执行方法可以使用Java上自带的TimerTask类,TimerTask相对于Thread来说对于资源消耗的更低,除了使用Android自带的AlarmManager使用Timer定时器是一种更好的解决方法。
【3】运行机制:
程序运行:
在初始化Timer时 ,开启一个线程循环提取任务数组中的任务,如果任务数组为空,线程等待直到添加任务;
当添加任务时,唤醒线程,提取数组中标记为1的任务,
如果该任务状态为CANCELLED,则从数组中删除任务,continue ,继续循环提取任务;
然后将当前时间与任务执行时间点比较 标记taskFired=executionTime<=currentTime;
taskFired =false ,说明任务执行时间还没到,则调用wait等待(executionTime-currentTime) 时间长度,然后循环重新提取该任务;
taskFired =true,说明任务执行时间已经到了,或者过去了。继续判断 任务循环时间间隔period;period=0时,说明此次任务是非循环任务,直接将该任务从数组中删除,并将状态置为EXECUTED,然后执行任务的run方法!
period!=0时,说明此次任务时循环任务,将该任务的执行时间点向前推进,具体推进时间根据调用的方法判断;
如果是schedule方法,则在当前时间基础上向前推进period时间长度;
如果是scheduleAtFixedRate方法,则在当前任务执行时间点基础上向前推进period时间长度,最后执行任务的run方法;循环提取任务
2,常用方法:
//time为Date类型:在指定时间执行一次。
timer.schedule(task, time);
//firstTime为Date类型,period为long,表示从firstTime时刻开始,每隔period毫秒执行一次。timer.schedule(task, firstTime, period);
//delay 为long类型:从现在起过delay毫秒执行一次。
timer.schedule(task, delay);
//delay为long,period为long:从现在起过delay毫秒以后,每隔period毫秒执行一次。
timer.schedule(task, delay, period);
3,简单使用:
public class MainActivity extends Activity {
private Timer timer;
private TimerTask task;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
System.out.println("我执行了");
}
};
//1秒后 执行task
timer.schedule(task, 1000,1000);
}
@Override
protected void onDestroy() {
//当Activity销毁的时候 终止计时器
timer.cancel();
task.cancel();
super.onDestroy();
}
}
4,使用timer 更新UI
public class MainActivity extends AppCompatActivity {
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
button.setText("wudi");
super.handleMessage(msg);
}
};
private Button button;
private Timer timer;
private TimerTask timerTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
//【1】创建定时器
timer = new Timer();
//【2】创建定时任务,把要做的事放在run方法里
timerTask = new TimerTask() {
@Override
public void run() {
Message message = new Message();
handler.sendMessage(message);
}
};
//【3】定时器进行安排
timer.schedule(timerTask, 12000);
}
@Override
protected void onDestroy() {
//【4】在activity消失的时候取消任务
timer.cancel();
timerTask.cancel();
super.onDestroy();
}
}