Android计时器和倒计时

时间:2021-04-21 20:35:58



1. 计时器



两个核心类 Timer 和 TimerTask

 

1) Timer核心方法

 

Java代码  Android计时器和倒计时
  1. //Schedules the specified task for execution after the specified delay.  
  2. void schedule(TimerTask task, long delay)  
  3.   
  4. //Schedules the specified task for repeated fixed-delay execution, beginning after the specified delay.  
  5. void schedule(TimerTask task, long delay, long period)  

 

 影音先锋电影 http://www.iskdy.com/ 

第一个方法只执行一次;

第二个方式每隔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代码  Android计时器和倒计时
  1. //总时长  
  2. private static final long TOTAL_QUERY_MINUTES = 50;  
  3. //比如每5秒去查询数据库  
  4. private static final long QUERY_INTERVAL = 5 *1000;  
  5.   
  6. private static final int TIMER_SCHEDULE_CODE = 1;  
  7.   
  8. int timePassed=0;  
  9.   
  10. QueryTimerTask queryTask;  
  11.   
  12. private Timer timer;  
  13.   
  14. //显示定时器的效果  
  15. ProgressBar statusBar;  
  16.   
  17. private Handler mHandler= new Handler(new Handler.Callback() {  
  18.   
  19.     @Override  
  20.     public boolean handleMessage(Message msg) {  
  21.         switch (msg.what) {  
  22.               
  23.             case TIMER_SCHEDULE_CODE:  
  24.                 statusBar.setProgress(timePassed);  
  25.   
  26.                 //Log.w(TAG, "timePassed : " + timePassed + " -- TOTAL_QUERY_MINUTES : " + TOTAL_QUERY_MINUTES);  
  27.                 if (timePassed>=TOTAL_QUERY_MINUTES){  
  28.                     if (timer != null)  
  29.                         timer.cancel();  
  30.   
  31.                     if (queryTask != null)  
  32.                         queryTask.cancel();  
  33.   
  34.   
  35.                     new AlertDialog.Builder(YourActivity.this).  
  36.                             setTitle("超时通知").setMessage("已超时,是否继续等待?")  
  37.                         .setPositiveButton("继续等待"new DialogInterface.OnClickListener() {  
  38.                             public void onClick(DialogInterface dialog, int which) {  
  39.                                 reSchedule();  
  40.                             }  
  41.                         })  
  42.                         .setNegativeButton("取消任务"new DialogInterface.OnClickListener() {  
  43.                             public void onClick(DialogInterface dialog, int which) {  
  44.                                 //cancelTask();  
  45.                             }  
  46.                         }).show();  
  47.                   
  48.                 break;  
  49.               
  50.             //....  
  51.         }  
  52.   
  53.         return true;  
  54.     }  
  55. });  
  56.   
  57. void reSchedule() {  
  58.     timePassed = 0;  
  59.   
  60.     if (timer != null) {  
  61.         timer.cancel();  
  62.     }  
  63.   
  64.     if (queryTask != null) {  
  65.         queryTask.cancel();  
  66.     }  
  67.   
  68.     timer = new Timer();  
  69.     queryTask = new QueryTimerTask();  
  70.     //每一秒执行一次,第一次有延时一秒的效果  
  71.     timer.schedule(queryTask, 10001000);  
  72. }  
  73.   
  74. //自定义task  
  75. class QueryTimerTask extends TimerTask {  
  76.     @Override  
  77.     public void run() {  
  78.   
  79.         //比如每过QUERY_INTERVAL去查询信息  
  80.         if ((timePassed * 1000) % QUERY_INTERVAL == 0) {  
  81.             //query();  
  82.         }  
  83.   
  84.         timePassed++;  
  85.   
  86.         //通知handler去改变statusBar  
  87.         Message message = mHandler.obtainMessage();  
  88.         message.what = TIMER_SCHEDULE_CODE;  
  89.         mHandler.sendMessage(message);  
  90.     }  
  91. }  


 伦理片 http://www.dotdy.com/

 

2. 倒计时

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

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