Android定时器,推荐ScheduledThreadPoolExecutor

官方网址:http://developer.android.com/reference/java/util/Timer.html

实现定时器的功能,有如下几种方法:
1、Threadsleep(long)方法
2、HandlerpostDelayed(Runnable, long)方法
3、TimerTimerTask结合的方法
这3种方法,本质上是一样的,都跟线程相关;这里主要讲下Timer。

定时器可以有个名称(name),也可以没有。

定时器,从线程类型的角度,可以分为如下两种:
1、普通类型;
2、后台(Deamon)类型;
Timer()---无名称,普通类型
Timer(String name)---有名称,普通类型
Timer(boolean isDaemon)---无名称,可指定类型
Timer(String name, boolean isDaemon)---有名称,可指定类型
参见:守护线程(Daemon Thread)

定时器,从执行次数的角度,可分为如下两种:
1、仅执行一次;属于这种的,有如下的两个成员函数:
schedule(TimerTask task, Date when)
schedule(TimerTask task, long delay)
2、循环执行;属于这种的,有如下的四个成员函数:
schedule(TimerTask task, Date when, long period)
schedule(TimerTask task, long delay, long period)
scheduleAtFixedRate(TimerTask task, long delay, long period)
scheduleAtFixedRate(TimerTask task, Date when, long period)
前两个,保证执行间隔是稳定的;两个,保证执行时间是稳定的。

由于定时器无法保证实时(real-time )特性;
也就是说,有可能因为某个执行太耗时,导致本该到时的定时器,得不到立即执行。
因此,当出现在这种“已经超时了,才轮到定时器执行”的情况时,就有了如下两种情况:
1、保证执行间隔是稳定的,即scheduledExecuteTime(第n+1次)=realExecuteTime(第n次)+periodTime)
2、保证执行时间是稳定的,即scheduledExecuteTime(第n+1次)=firstExecuteTime +n*periodTime

定时器,还可以取消(cancel())和清理(purge(),即清除所有已取消的)

在JDK1.5之前,定时/周期操作都是通过Timer来实现的。但是Timer有以下几种危险:
1、Timer是基于绝对时间的。容易受系统时钟的影响。 
2、Timer只新建了一个线程来执行所有的TimeTask;所有TimeTask可能会受相关影响。 
3、Timer不会捕获TimerTask的异常,只是简单地停止;这会影响其他TimeTask的执行。 
如果使用JDK1.5以上版本,建议用ScheduledThreadPoolExecutor代替Timer。
它采用相对时间,用线程池来执行TimerTask,会处理TimerTask异常。 
它基本上解决了上述的所有问题。

Android定时器,推荐ScheduledThreadPoolExecutor的更多相关文章

  1. [Android Pro] Android 官方推荐 : DialogFragment 创建对话框

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37815413 1. 概述 DialogFragment在android 3.0时 ...

  2. android Google推荐的容器SparseArrayCompat简介

    android Google推荐的容器SparseArrayCompat简介 private static SparseArrayCompat<BaseFragment> mCaches ...

  3. 转帖:Android 官方推荐 : DialogFragment 创建对话框

    转: Android 官方推荐 : DialogFragment 创建对话框 复制内容,留作备份 1. 概述 DialogFragment在android 3.0时被引入.是一种特殊的Fragment ...

  4. 定时器Timer&ScheduledThreadPoolExecutor

    定时器Timer&ScheduledThreadPoolExecutor /** * @ClassName: TimerTest * @author: daniel.zhao * @date: ...

  5. Android TitleBar推荐

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/206 Android TitleBar推荐 这段时间在帮别 ...

  6. Android 官方推荐 : DialogFragment 创建对话框

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37815413 1. 概述 DialogFragment在android 3.0时 ...

  7. android 定时器AlarmManager

    1.android中通常是使用AlarmManager来定时启动一个单次或重复多次操作的.具体的说就是我们通过AlarmManager设定一个时间和注册一个intent到系统中,然后在该时间到来时,系 ...

  8. android 定时器的实现

    在Android上常用的定时器有两种,一种是Java.util.Timer,一种就是系统的AlarmService了. 实验1:使用Java.util.Timer. 在onStart()创创建Time ...

  9. android 定时器的使用

    1.android中通常是使用AlarmManager来定时启动一个单次或重复多次操作的.具体的说就是我们通过AlarmManager设定一个时间和注册一个intent到系统中,然后在该时间到来时,系 ...

随机推荐

  1. Fisher information matrix笔记

    在看FK论文时,fisher information matrix是必须理解的. 从维基百科查阅到,Fisher information matrix是用利用最大似然函数估计来计算方差矩阵. 来源于: ...

  2. Intent传输数据的补充

    发现用intent的putExtra()或者putExtras()传输的都是基本数据类型. 如果要传输自定义数据类型,就要用到其他方法,老罗介绍的大概有3种: 1.  静态变量 2.  全局变量 3. ...

  3. STL map详细用法和make_pair函数

    今天练习华为上机测试题,遇到了map的用法,看来博客http://blog.csdn.net/sprintfwater/article/details/8765034:感觉很详细,博主的其他内容也值得 ...

  4. Jersey Rest服务类型

    在Rest服务中,资源类是接收Rest请求并完成响应的核心类,而资源类由Rest服务的“提供者”来调度的,这一定义类似于自定义Servlet类,该类会奖请求分派给指定的Controller/Actio ...

  5. ubuntu下apt-get update出现hash校验和错误

    可能原因 校园网进行网络缓存导致内容滞后. 解决办法 先清除旧的apt-get更新列表 sudo rm -rf /var/lib/apt/lists/* 使用代理服务器或者VPN 重新更新 sudo ...

  6. cocos2d-html5对话界面设计

    "use strict" var _dialogMsgBottom = null; var _dialogMsgTop = null; ; var _dialogConfig = ...

  7. Ubuntu14.04上安装pip的方法

    在Ubuntu14.04上,建议通过下面的方法安装,这是一种通用的方法,也适用于Windows,当然在Windows下 手动下载下来就行了 wget https://bootstrap.pypa.io ...

  8. 三、 将DataTable 转换为List

    1. 方法public static IList<T> ConvertTo<T>(DataTable table) { if (table == null) { return ...

  9. hdu 4115 Eliminate the Conflict ( 2-sat )

    Eliminate the Conflict Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  10. 在drupal7中动态的为某个内容类型添加字段

    $myField_name = "my_new_field_name"; if(!field_info_field($myField_name)) // check if the ...