Android计时器和倒计时

计时器

两个核心类Timer 和TimerTask

1) Timer核心方法

Java代码

//Schedulesthespecifiedtaskforexecutionafterthespecifieddelay.

voidschedule(TimerTasktask,longdelay)

//Schedulesthespecifiedtaskforrepeatedfixed-delayexecution,beginningafterthespecifieddelay.

voidschedule(TimerTasktask,longdelay,longperiod)

第一个方法只执行一次;

第二个方式每隔period执行一次,delay表示每次执行的延时时间,其实主要表现在第一次的延时效果,比如delay设置为0,那么立马执行task内容,如果设置为1000,那么第一次执行task会有一秒的延时效果。

2) TimerTask用于继承(或者直接定义并初始化匿名类),并重写run方法,定义自己的业务逻辑。

3) 手动结束定时器,

Timer和TimerTask都有cancel方法,而且最好同时调用;

如果已经cancel,下次必须创建新的Timer才能schedule。

4) 如果你在当前的activity中schedule了一个task,但是没有等到task结束,就按Back键finish了当前的activity,Timer和TimerTask并不会自动cancel或者销毁,它还会在后台运行,此时如果你在task的某个阶段要调起一个控件(比如AlertDialog),而该控制依赖被销毁的activity,那么将会引发crash。

5) 例如对进度条实现每一秒递增的效果(主要代码)

Java代码

//总时长

privatestaticfinallongTOTAL_QUERY_MINUTES=50;

//比如每5秒去查询数据库

privatestaticfinallongQUERY_INTERVAL=5*1000;

privatestaticfinalintTIMER_SCHEDULE_CODE=1;

inttimePassed=0;

QueryTimerTaskqueryTask;

privateTimertimer;

//显示定时器的效果

ProgressBarstatusBar;

privateHandlermHandler=newHandler(newHandler.Callback(){

@Override

publicbooleanhandleMessage(Messagemsg){

switch(msg.what){

caseTIMER_SCHEDULE_CODE:

statusBar.setProgress(timePassed);

//Log.w(TAG,"timePassed:"+timePassed+"--TOTAL_QUERY_MINUTES:"+TOTAL_QUERY_MINUTES);

if(timePassed>=TOTAL_QUERY_MINUTES){

if(timer!=null)

timer.cancel();

if(queryTask!=null)

queryTask.cancel();

newAlertDialog.Builder(YourActivity.this).

setTitle("超时通知").setMessage("已超时,是否继续等待?")

.setPositiveButton("继续等待",newDialogInterface.OnClickListener(){

publicvoidonClick(DialogInterfacedialog,intwhich){

reSchedule();

}

})

.setNegativeButton("取消任务",newDialogInterface.OnClickListener(){

publicvoidonClick(DialogInterfacedialog,intwhich){

//cancelTask();

}

}).show();

break;

//....

}

returntrue;

}

});

voidreSchedule(){

timePassed=0;

if(timer!=null){

timer.cancel();

}

if(queryTask!=null){

queryTask.cancel();

}

timer=newTimer();

queryTask=newQueryTimerTask();

//每一秒执行一次,第一次有延时一秒的效果

timer.schedule(queryTask,1000,1000);

}

//自定义task

classQueryTimerTaskextendsTimerTask{

@Override

publicvoidrun(){

//比如每过QUERY_INTERVAL去查询信息

if((timePassed*1000)%QUERY_INTERVAL==0){

//query();

}

timePassed++;

//通知handler去改变statusBar

Messagemessage=mHandler.obtainMessage();

message.what=TIMER_SCHEDULE_CODE;

mHandler.sendMessage(message);

}

}

2. 倒计时

其实也可以用上面的方法实现,

安卓额外提供了CountdownTimer类,以后再补充

文章来源:http://itlanbao.com/preview.aspx#1,0