Android Timer定时器

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)周期性的执行某项操作

使用的步骤:

获取管理器。AlarmManager alarmManager = this.getSystemService(ALARM_SERVICE);

通过AlarmManagersetsetRepeating方法定时。当需要取消时可以通过cancel()方法取消定时。

alarmManager.setRepeating(AlarmManager.RTC, 0, 5000, pendingIntentActivity);

setsetRepeating方法中,第一个参数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()+5000pendingIntent);

如果使用RTC_WAKEUP类型 应该调用System.currentTimeMillis()获取从1970.1.1号以来的时间在加上你设定的延迟时间

alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+5000pendingIntent);

setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation);

参数一:type表示定时模式

参数二:triggerAtTime表示执行延迟时间(第一次启动定时任务的时间),单位是毫秒

参数三:interval表示执行的时间间隔,单位是毫秒

参数四:operation是一个PendingIntent对象,表示到时间后要执行的操作.

补充:

Android开发过程中为什么要使用线程?

   我们创建的ServiceActivity以及Broadcast均是一个主线程处理,这里我们可以理解为UI线程。但是在操作一些耗时操作时,比如I/O读写的大文件读写,数据库操作以及网络下载需要很长时间,为了不阻塞用户界面,出现ANR的响应提示窗口,这个时候我们可以考虑使用Thread线程来解决。

 1. 对于线程中的刷新一个View为基类的界面,可以使用postInvalidate()方法在线程中来处理, postInvalidateDelayed(long delayMilliseconds)方法表示延迟执行,参数为毫秒.

2. 也通过一个Handler来刷新View,可以在一个线程的run方法中调用handler对象的 postsendMessage方法来实现,Android程序内部维护着一个消息队列,会轮训处理这些。

3. Looper又是什么呢其实Android中每一个Thread都跟着一个LooperLooper可以帮助Thread维护一个消息队列, 

4. Message Android是什么呢在线程中使用Handler对象的sendEmptyMessagesendMessage方法来传递一个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()  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值