• Android计时器和倒计时

  • 计时器

  1. 两个核心类Timer 和TimerTask

1) Timer核心方法

Java代码

  1. //Schedulesthespecifiedtaskforexecutionafterthespecifieddelay.

  2. voidschedule(TimerTasktask,longdelay)

  3. //Schedulesthespecifiedtaskforrepeatedfixed-delayexecution,beginningafterthespecifieddelay.

  4. 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代码

  1. //总时长

  2. privatestaticfinallongTOTAL_QUERY_MINUTES=50;

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

  4. privatestaticfinallongQUERY_INTERVAL=5*1000;

  5. privatestaticfinalintTIMER_SCHEDULE_CODE=1;

  6. inttimePassed=0;

  7. QueryTimerTaskqueryTask;

  8. privateTimertimer;

  9. //显示定时器的效果

  10. ProgressBarstatusBar;

  11. privateHandlermHandler=newHandler(newHandler.Callback(){

  12. @Override

  13. publicbooleanhandleMessage(Messagemsg){

  14. switch(msg.what){

  15. caseTIMER_SCHEDULE_CODE:

  16. statusBar.setProgress(timePassed);

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

  18. if(timePassed>=TOTAL_QUERY_MINUTES){

  19. if(timer!=null)

  20. timer.cancel();

  21. if(queryTask!=null)

  22. queryTask.cancel();

  23. newAlertDialog.Builder(YourActivity.this).

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

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

  26. publicvoidonClick(DialogInterfacedialog,intwhich){

  27. reSchedule();

  28. }

  29. })

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

  31. publicvoidonClick(DialogInterfacedialog,intwhich){

  32. //cancelTask();

  33. }

  34. }).show();

  35. break;

  36. //....

  37. }

  38. returntrue;

  39. }

  40. });

  41. voidreSchedule(){

  42. timePassed=0;

  43. if(timer!=null){

  44. timer.cancel();

  45. }

  46. if(queryTask!=null){

  47. queryTask.cancel();

  48. }

  49. timer=newTimer();

  50. queryTask=newQueryTimerTask();

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

  52. timer.schedule(queryTask,1000,1000);

  53. }

  54. //自定义task

  55. classQueryTimerTaskextendsTimerTask{

  56. @Override

  57. publicvoidrun(){

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

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

  60. //query();

  61. }

  62. timePassed++;

  63. //通知handler去改变statusBar

  64. Messagemessage=mHandler.obtainMessage();

  65. message.what=TIMER_SCHEDULE_CODE;

  66. mHandler.sendMessage(message);

  67. }

  68. }

2. 倒计时

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

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

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

更多相关文章

  1. Android执行shell命令
  2. Android(安卓)AM命令行启动程序的方法
  3. Android(安卓)JNI入门第六篇——C调用Java
  4. 2011.09.15 ——— android 桌面添加快捷方式之判断是否存在无效
  5. Android中字符串片段高亮
  6. Android热插拔事件处理详解
  7. Android(安卓)使用BottomNavigationView实现底部导航栏
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Android学习笔记:androidmanifest.xml 高
  2. Android(安卓)tips2
  3. 多方向抽屉效果
  4. MyCms 自媒体 CMS 系统 v3.1.0,新增商城接
  5. 【北亚数据恢复】IBM DS系列存储服务器硬
  6. Circle Linux镜像在阿里云镜像站首发上线
  7. 绘画有哪几种构图方法?绘画构图的方法
  8. cg怎么学?学CG绘画步骤
  9. 动漫配色怎么学习?绘画上色教程图解
  10. Anaconda Navigator卡logo打不开闪退问题