Handler
通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,但此时并没有运行,它需要CPU时间片。一旦得到CPU时间片,就会执行run()方法。run()的方法体称为线程体,它包含了要执行的这个线程的内容,run()方法运行结束,此线程也随即终止。
经过测试,这种倒计时方式锁屏之后20s左右就会失效(timer不会失效)
mHandler.postDelayed(new Runnable() { @Override public void run() { mHandler.postDelayed(this, 1000); } }, 1000);
Timer
一个Timer内部封装装了“一个Thread”和“一个TimerTask队列”,这个队列按照一定的方式将任务排队处理。封装的Thread在Timer的构造方法调用时被启动,这个Thread的run方法按照条件去循环这个TimerTask队列,然后调用TimerTask的run方法。 但是,如果CPU进入了休眠状态,那么这个thread将会因为失去CPU时间片而阻塞,从而造成我们需要的定时任务失效。
样例:自定义一个button,点击之后开启倒计时,并在button上显示剩余时间,同时要确保锁屏之后继续正常倒计时(handler锁屏会失效)。
创建一个TimeButton集成Button
public class TimeButton extends Button{
初始化定时器
private void initTimer(){ timer = new Timer(); task = new TimerTask() { @Override public void run() { mHandler.sendEmptyMessage(777); } }; }
启动定时器
public void start(){ initTimer(); timer.schedule(task , 0 , 1000);//延迟0s,每隔1s执行一次run方法定期刷新Button的textthis.setText(cycle + "");}