您的位置:首页 > 移动开发 > Android开发

Android Timer定时器

2013-03-19 19:57 239 查看
Android Timer定时器
知识点概述:
1. 计时器Chronometer
2. 定时器Timer
3. 全局定时器AlarmManager
知识点详述:
1. 计时器Chronometer
用于计时的组件,是TextView的子类,以1秒的时间间隔进行计时,并显示计时结果.
Chronometer类方法介绍:
Start(); //开始计时
Stop(); //停止计时
setBase(); //设置开始计时的基准时间,单位为毫秒,若取当前时刻,可用SystemClock.elapsedRealtime()获取
setFormat(); //设置显示计时信息内容,用”%s”表示计时信息
注:可以对 Chronometer注册OnChronometerTickListener监听,然后通过其onChronometer事件方法来捕捉计时动作.该方法1秒调用一次.

2. 定时器Timer
在Android平台中需要反复按周期执行的功能可以使用Java上自带的TimerTask类来实现,TimerTask相对于Thread来说消耗资源更低。需要引入java.util.Timer 和 java.util.TimerTask.
Timer类通过schedule方法设置执行方式和重复执行的时间间隔. Schedule方法的第一个参数是TimerTask,TimeTask类实现了Runnable接口,即Timer实际上是在线程中执行代码,在run方法中不能更新UI.

3. 全局定时器AlarmManager
AlarmManager的使用机制称为全局定时器。其实它的作用和Timer有点相似。都有两种相似的用法:(1)在指定时长后执行某项操作(2)周期性的执行某项操作
使用的步骤:
l 获取管理器。AlarmManager alarmManager = this.getSystemService(ALARM_SERVICE);
l 通过AlarmManager的set和setRepeating方法定时。当需要取消时可以通过cancel()方法取消定时。
alarmManager.setRepeating(AlarmManager.RTC, 0, 5000, pendingIntentActivity);
在set和setRepeating方法中,第一个参数type代表定时模式,这里的定时模式主要有以下几种。
ELAPSED_REALTIME //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是3

ELAPSED_REALTIME_WAKEUP //能唤醒系统,用法同ELAPSED_REALTIME,系统值是2

RTC //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用 System.currentTimeMillis()获得。系统值是1

RTC_WAKEUP //能唤醒系统,用法同RTC类型,系统值为 0
注: 它大致分为两种类型 一种是相对时间 一种是绝对时间.所以,根据使用的类型不同 triggerAtTime设置也有所不同
如果使用ELAPSED_REALTIME_WAKEUP类型 应该调用SystemClock.elapsedRealtime()获取相对时间在加上你设定的延迟时间
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+5000, pendingIntent);
如果使用RTC_WAKEUP类型 应该调用System.currentTimeMillis()获取从1970.1.1号以来的时间在加上你设定的延迟时间
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+5000, pendingIntent);

setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation);
参数一:type表示定时模式
参数二:triggerAtTime表示执行延迟时间(第一次启动定时任务的时间),单位是毫秒
参数三:interval表示执行的时间间隔,单位是毫秒
参数四:operation是一个PendingIntent对象,表示到时间后要执行的操作.

补充:
Android开发过程中为什么要使用线程?
我们创建的Service、Activity以及Broadcast均是一个主线程处理,这里我们可以理解为UI线程。但是在操作一些耗时操作时,比如I/O读写的大文件读写,数据库操作以及网络下载需要很长时间,为了不阻塞用户界面,出现ANR的响应提示窗口,这个时候我们可以考虑使用Thread线程来解决。
1. 对于线程中的刷新一个View为基类的界面,可以使用postInvalidate()方法在线程中来处理, postInvalidateDelayed(long delayMilliseconds)方法表示延迟执行,参数为毫秒.
2. 也通过一个Handler来刷新View,可以在一个线程的run方法中调用handler对象的 post或sendMessage方法来实现,Android程序内部维护着一个消息队列,会轮训处理这些。
3. Looper又是什么呢? 其实Android中每一个Thread都跟着一个Looper,Looper可以帮助Thread维护一个消息队列,
4. Message 在Android是什么呢? 在线程中使用Handler对象的sendEmptyMessage或sendMessage方法来传递一个Bundle对象到Handler处理器。对于Handler类提供了重写方法handleMessage(Message msg) 来判断,通过msg.what来区分每条信息。进而更新UI线程中的内容实现控件的刷新操作。

总结: handler主要用于更新UI.
用法一: handler使用Message
1.定义一个Handler
2.重写消息处理函数
3.发送消息
用法二: 利用handler.post()更新UI
1.创建一个Handler
2.调用Handler.post(Runnable r)方法
3.Runnable运行在UI所在线程,所以可以直接调用View.invalidate()
用法三: 在新线程里更新UI,可以直接使用postInvalidate()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: