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
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。