一、Timer是什么
在Android应用程序中,计时器(timer)是一种十分重要的工具,它可以用来调度一些需要在后台线程中定时执行的任务。Timer类提供了一些方法使得我们可以在Java线程中安排timer任务,它们可以被安排为一次性(只执行一次)或重复性(周期性)的任务。
这些任务对于开发周期性任务的后台服务十分有用,例如腾讯QQ或微信等这类应用中,会有应用内通知的消息推送(例如好友请求、聊天消息等),这种消息推送通常是通过timer来实现的。
二、Timer的基本用法
下面是一个基础的Timer的用法示例:
Timer timer = new Timer(); TimerTask timerTask = new TimerTask() { @Override public void run() { // 定时器做的任务放在这里 } }; timer.schedule(timerTask, 0, 1000);
上述代码中,我们首先创建了一个Timer对象(如果您使用Java开发,这一步应该比较熟悉),然后创建了一个TimerTask对象,该对象包含了需要周期性任务执行的内容。
接着,我们调用timer对象的schedule方法,用来安排timer任务的运行。schedule方法接收3个参数,第一个参数是需要执行的任务对象,第二个参数是该任务需要多久后开始执行(单位是毫秒),第三个参数是需要周期性执行的时间间隔(单位也是毫秒)。
三、Timer的常用方法
1. schedule
public void schedule(TimerTask task, long delay, long period)
上面我们已经使用了schedule方法,该方法可用于周期性执行任务。如需执行一次性的任务,则将period参数设置为0即可。
2. scheduleAtFixedRate
public void scheduleAtFixedRate(TimerTask task, long delay, long period)
除了schedule方法之外,Timer还提供了scheduleAtFixedRate方法,它也可以周期性执行任务,但与schedule不同的是,该方法的执行时间是固定的,即尽可能地保证在周期时间之后立即执行下一次任务,而schedule方法是尽可能每次执行间隔时长为period,这样如果上一次任务执行时间过长,则会对下一次任务执行时间产生影响。
3. cancel
public void cancel()
cancel方法用于取消timer中的所有计划任务。注意,每次调度计时器都只能调用一次该方法,不能重复调用。
4. purge
public int purge()
purge方法用于删除已执行完毕的计划任务,以防止这些任务占用资源,但实际上这些任务可能一直被保留在优先队列中,该方法只是用来清理它们而已。
四、Timer的线程安全性问题
在使用Timer时,我们需要注意到一个重要的问题:在timer内部,存在自己的线程(scheduling thread),该线程用于执行计划任务并调度线程池。这就意味着,许多timer操作都是在timer线程上执行,而不是调用schedule方法的主线程上执行,尤其是一些需要频繁进行任务修改的操作,该问题有可能会在多线程情况下产生不期望的结果。
因此,为了避免出现这种情况,我们需要进行线程同步,或使用单独的线程来执行计划任务。
五、小结
本文中介绍了Android中计时器Timer的基本用法以及相关方法。使用timer可以在后台线程中执行周期性任务,例如在应用中进行消息推送、闹钟功能以及数据更新异步操作等。需要注意的是,在多线程情况下需要进行线程同步以避免出现线程安全的问题。