在android中,经常用到的定时器主要有以下几种实现: 
一、采用Handler与线程的sleep(long )方法 
二、采用Handler的postDelayed(Runnable, long) 方法 
三、采用Handler与timer及TimerTask结合的方法。 
详细介绍: 
一、采用Handle与线程的sleep(long )方法 
Handler主要用来处理接受到的消息。这只是最主要的方法,当然Handler里还有其他的方法供实现,有兴趣的可以去查API,这里不过多解释。 
1、定义一个Handler类,用于处理接受到的Message.

 Handler handler = new Handler() { public void handleMessage(Message msg) {
//要做的事情 super.handleMessage(msg); } }; 

2、新建一个实现Runnable接口的线程类。如下:

  public class MyThread implements Runnable{ @Override public void run() {
// TODO Auto-generated method stub while (true) { try { Thread.sleep(10000);//线程暂停10秒,单位毫秒 Message message=new Message(); message.what=1; handler.sendMessage(message);//发送消息 } catch (InterruptedException e) {
// TODO Auto-generated catch block e.printStackTrace(); } } } } 

3、在需要启动线程的地方加入下面语句:

new Thread(new MyThread()).start(); 

4、启动线程后,线程每10s发送一次消息。 
二、采用Handler的postDelayed(Runnable, long) 方法 
这个实现比较简单一些: 
1、

 Handler handler=new Handler(); Runnable runnable=new Runnable(){ @Override public void run() {
// TODO Auto-generated method stub
//要做的事情 handler.postDelayed(this, 2000); } }; 

2、启动计时器:

handler.postDelayed(runnable, 2000);//每两秒执行一次runnable. 

3、停止计时器:

handler.removeCallbacks(runnable); 

三、采用Handler与timer及TimerTask结合的方法。 
1、定义定时器、定时器任务及Handler句柄

 private final Timer timer = new Timer(); private TimerTask task; Handler handler = new Handler() { @Override public void handleMessage(Message msg) {
// TODO Auto-generated method stub
//要做的事情 super.handleMessage(msg); }}; 

2、初始化计时器任务。

 task = new TimerTask() { @Override public void run() {
// TODO Auto-generated method stub Message message = new Message(); message.what = 1; handler.sendMessage(message); } };

3、启动定时器

timer.schedule(task, 2000, 2000); 

分析:

1、定义定时器、定时器任务及Handler句柄

定时器任务(TimerTask)顾名思义,就是说当定时器到达指定的时间时要做的工作,这里是想Handler发送一个消息,由Handler类进行处理。

2、初始化计时器任务。

java.util.Timer.schedule(TimerTask task, long delay):这个方法是说,dalay/1000秒后执行task.只执行一次。
 java.util.Timer.schedule(TimerTask task, long delay, long period):这个方法是说,delay/1000秒后执行task,然后进过period/1000秒再次执行task,这个用于循环任务,执行无数次,当然,你可以用timer.cancel();取消计时器的执行。

3、启动定时器

然后是有关 Java.util.Timer 和 AlarmService的
在Android上常用的定时器有两种,一种是Java.util.Timer,一种就是系统的AlarmService了。
实验1:使用Java.util.Timer。 
在onStart()创创建Timer,每5秒更新一次计数器,并启动。

  mTimer = new Timer();          mTimer.schedule(new TimerTask() {              @Override  public void run() {   ++mCount;   mHandler.sendEmptyMessage(0);                 }   }, 5*1000, 5*1000);  mTimer = new Timer();                mTimer.schedule(new TimerTask() {                        @Override public void run() { ++mCount; mHandler.sendEmptyMessage(0);                               } }, 5*1000, 5*1000);    

当连接USB线进行调试时,会发现一切工作正常,每5秒更新一次界面,即使是按下电源键,仍然会5秒触发一次。 
当拔掉USB线,按下电源键关闭屏幕后,过一段时间再打开,发现定时器明显没有继续计数,停留在了关闭电源键时的数字。

实验2:使用AlarmService: 
(1)通过AlarmService每个5秒发送一个广播,setRepeating时的类型为AlarmManager.ELAPSED_REALTIME。

AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, 5*1000, sender); 
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, 5*1000, sender);

拔掉USB线,按下电源键,过一段时间再次打开屏幕,发现定时器没有继续计数。 
(2)setRepeating是的类型设置为AlarmManager.ELAPSED_REALTIME_WAKEUP

AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 5*1000, sender); 
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 5*1000, sender);

拔掉USB线,按下电源键,过一点时间再次打开屏幕,发现定时器一直在计数。

如此看来,使用WAKEUP才能保证自己想要的定时器一直工作,但是肯定会引起耗电量的增加。

最后是有关schedule和scheduleAtFixedRate区别

schedule和scheduleAtFixedRate 区别:

(1) 2个参数的schedule在制定任务计划时,如果指定的计划执行时间scheduledExecutionTime<= systemCurrentTime,则task会被立即执行。scheduledExecutionTime不会因为某一个task的过度执行而改变。
 (2) 3个参数的schedule在制定反复执行一个task的计划时,每一次执行这个task的计划执行时间随着前一次的实际执行时间而变,也就是 scheduledExecutionTime(第n+1次)=realExecutionTime(第n次)+periodTime。也就是说如果第n 次执行task时,由于某种原因这次执行时间过长,执行完后的systemCurrentTime>= scheduledExecutionTime(第n+1次),则此时不做时隔等待,立即执行第n+1次task,而接下来的第n+2次task的 scheduledExecutionTime(第n+2次)就随着变成了realExecutionTime(第n+1次)+periodTime。说白了,这个方法更注重保持间隔时间的稳定。
 (3)3个参数的scheduleAtFixedRate在制定反复执行一个task的计划时,每一次执行这个task的计划执行时间在最初就被定下来了,也就是scheduledExecutionTime(第n次)=firstExecuteTime +n*periodTime;如果第n次执行task时,由于某种原因这次执行时间过长,执行完后的systemCurrentTime>= scheduledExecutionTime(第n+1次),则此时不做period间隔等待,立即执行第n+1次task,而接下来的第n+2次的 task的scheduledExecutionTime(第n+2次)依然还是firstExecuteTime+(n+2)*periodTime这在第一次执行task就定下来了。说白了,这个方法更注重保持执行频率的稳定。
 
Timer的实例:

package com.hemes.timer;import java.util.*;public class doTask extends TimerTask {// true时使用后台进程线程。只要剩下的程序记叙运行,后台进程线程就会执行。 Timer myTimer;public void start(int delay, int hour) { myTimer = new Timer(); myTimer.schedule(this, delay * 1000, hour*1000*60*60); //利用timer.schedule方法//public void schedule(TimerTask task,long time,long period) //task被安排在延迟time后执行,执行后将每隔period(毫秒)反复执行。由于规定的时间间隔并不能保证与时钟精准的同不步,所以该方 } public void start(Date time, int hour) { myTimer = new Timer(); myTimer.schedule(this, time, hour*1000*60*60); //利用timer.schedule方法 //public void schedule(TimerTask task,Date time,long period) //task被安排在time指定的时间执行,执行后将每隔period(毫秒)反复执行。由于规定的时间间隔并不能保证与时钟精准的同不步,所以该方 } public void run() { //执行任务(sql) System.out.println("do Task..."); } public void end(){ myTimer.cancel(); //终止Timer的功能执行,但不会对正在执行的任务有影响。当执行cancel方法后将不能再用其分配任务。 } } 

调用入口:

         doTask myTask1 = new doTask(); //Get the Date corresponding to 11:30:00 pm today. Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 23); calendar.set(Calendar.MINUTE, 30); calendar.set(Calendar.SECOND, 0); Date time = calendar.getTime();myTask1.start(time,24); //myTask1.end();//线程结束 

android之几种定时器实现相关推荐

  1. android 定时器使用的比较,Android中几种定时器的总结和比较

    在android中,一般有下面几种方式实现定时任务: 采用Handler与线程的sleep(long)方法 采用Handler的postDelayed(Runnable, long)方法 采用Hand ...

  2. android几种定时器机制及区别

    在android中,经常用到的定时器主要有以下几种实现: 一.采用Handler与线程的sleep(long )方法 二.采用Handler的postDelayed(Runnable, long) 方 ...

  3. Android方法的概括,Android_Android中startService基本使用方法概述,Android中有两种主要方式使用Ser - phpStudy...

    Android中startService基本使用方法概述 Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindServi ...

  4. android不调用系统发送短信,android之两种方式调用短信发送接口

    释放双眼,带上耳机,听听看~! 相信很多程序员在开发程序的时候都会遇到短信调用端口的情况,今天是技术狗小编为大家带来的关于android之两种方式调用短信发送接口,希望对你学习这方面知识有帮助! an ...

  5. Android开发之三种动画

    转载:http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html http://www.lightskystreet.com/2 ...

  6. android项目两种构建方式的整合(Eclipse/idea和Android Studio)

    android的两种构建方式 目前android主要有两种构建方式,一种基于ant(传统的),另一种是13年Google/IO上新推出基于Gralde的构建(Android Studio).从sdk的 ...

  7. android物联网开发技术架构,Android 相关七种 CPU 架构适配,android七种

    Android 相关七种 CPU 架构适配,android七种 转载请注明出处:http://blog.csdn.net/kester_/article/details/71055901 NDK 开发 ...

  8. Android中四种补间动画的使用示例(附代码下载)

    场景 Android中四种补间动画. 透明度渐变动画 旋转动画 缩放动画 平移动画 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的 ...

  9. Android AsyncTask两种线程池分析和总结

    转自:http://bbs.51cto.com/thread-1114378-1-1.html Android AsyncTask两种线程池分析和总结 (一)    前言 在android Async ...

最新文章

  1. 内蒙古公安原创扫黑除恶主题MV《以警之名》全国首发
  2. Linux内核探讨-- 第四章
  3. 网站优化新方式亟需创新
  4. python 函数装饰器学习
  5. 中国人民银行:关于防范代币发行融资风险的公告
  6. c语言线程面试题,java多线程面试题 PDF 下载
  7. 推荐:学习自然语言处理(NLP)的学习方法和资料合集
  8. 三极管工作原理_4种集电极-基极负反馈式三极管偏置电路的工作原理分析
  9. SAP Spartacus入口Component - StorefrontComponent
  10. SAP License:SAP 期待CO新帐 VS FI新总帐
  11. 一次性医用外科手套行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  12. [label][paypal] Paypal 支付页面的语言显示问题
  13. 如何解决第三方JavaScript引入工程后报错
  14. android核心系列--1,组件生命周期
  15. Mugeda(木疙瘩)H5案例课—H5酷炫特效制作-岑远科-专题视频课程
  16. 思科ccnp认证工程师必看
  17. easyUI非常迷惑性的bug:分页插件点击下一页和尾页后,发送两次请求,第二次请求回跳转到第一页
  18. vue中引入高德地图并多点标注
  19. 14-TSS切换实验
  20. 力矩 torque详解

热门文章

  1. 三小时爬取四万份年报
  2. Unity Shader 实现简单的贴花效果(二)
  3. Android绘图学习 - 手写板
  4. 开关电源的EMI滤波器
  5. Win10设置免密自动登录
  6. php仿信用卡积分商城,php实现通用的信用卡验证类
  7. 多因子模型之因子(信号)测试平台----计算因子值
  8. i5 10400F配什么主板?
  9. 读书04《番茄工作法图解上》
  10. JSON Web Token (JWT)笔记(token实现单点登录功能)