前言

  google在Android上提供了很多个关于时间的操作类,比如长时间的定时操作可以使用AlarmManager 定时器,而中等时间和短时间的定时操作就依靠Timer与TimerTask来实现.其实Timer与TimerTask的用法很简单并没有可以多说的,直接看代码即可.

简单的Demo

有一点要注意TimerTask的run()是在子线程的.

private void timeTask(){
TimerTask timerTask = new TimerTask() { //创建定时触发后要执行的逻辑任务
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "触发TimerTask", Toast.LENGTH_SHORT).show();
}
}); }
}; Timer timer = new Timer();
timer.schedule(timerTask, 5*1000); //启动定时任务 }

TimerTask API介绍

仅有三个拉出来说明一下

        timerTask.scheduledExecutionTime();//返回这个任务的预定执行时间
timerTask.cancel();//取消,取消这个任务
timerTask.run();//执行run(); 差不多就是立即执行任务了

Timer API介绍

        timer.cancel();//取消这个定时器,但是不停止正在执行的任务,停止后此定时器无法在添加TimerTask任务(线程被关闭了)
timer.purge();//清除TimerTask任务,从此计时器的任务队列中删除所有已取消的任务,调用此方法对计时器的行为没有影响
timer.scheduleAtFixedRate(timerTask, 5*1000, 10*1000);//重复执行任务,第二个参数为延迟执行任务的时间,第三个参数为后续重复任务的延迟时间

请注意 timer.cancel(); 这里的取消是取消定时器与取消任务是不一样的..

一些坑

  1.Timer 定时器,在定时长时间任务的情况下就会开始出现不准确或者不触发推迟很久触发的问题。能准确触发是根据设备是否睡眠的情况而定的,如设备未睡眠那么30分钟内的都是相对准确的,但是不保证大于30分钟是否准确。 而如果设备已经睡眠,只要睡过去了大概就根据Doze模式的周期触发定时器了。定时越长越不准确并可能被延迟的越长或者干脆不触发。  以上是我个人在项目实际情况下的经验之谈。 我在物联设备项目里,我们的物联设备关闭了Doze模式,但是原生的Android系统依然会有自带睡眠功能(这个自带的睡眠可以被一直打扰唤醒,没有Doze模式这么强规则),如果你设定一个3小时后的任务,那么基本上是不会触发这个任务的。 而设置30分钟左右的任务还是能够准确触发。 所以结论是如果长时间的定时任务还是交给AlarmManager来完成。 而30分钟内的定时任务并且设备不会睡眠的情况下可以交给Timer来完成,如果是10分钟 5分钟的短定时 完全就可以交给它来完成定时任务了。

end

Android 开发 重写定位器类Timer与TimerTask的更多相关文章

  1. Android开发常用工具类

    来源于http://www.open-open.com/lib/view/open1416535785398.html 主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前 ...

  2. Android开发 静态static类与static方法持有Context是否导致内存泄露的疑问

    简述 在Android开发的过程中,难免会使用单例模式或者静态方法工具类.我们会让它们持有一些外部的Context或者View一般有以下几种情况: 单例模式,类的全局变量持有Context 或 Vie ...

  3. 最全Android开发常用工具类

    主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前包括  HttpUtils.DownloadManagerPro.Safe.ijiami.ShellUtils.Pack ...

  4. 29个android开发常用的类、方法及接口

    在安卓开发中,我们常常都需要借助各种各样的方法.类和接口来实现相关功能.提升开发效率,但对于初学者而言,什么时候该用什么类.方法和接口呢?下面小编整理了29个,日常开发中比较常用的类.方法.接口及其应 ...

  5. Android开发中JavaBean类和序列化知识的理解

    原创文章,转载请注明出处:http://www.cnblogs.com/baipengzhan/p/6296121.html Android开发中,我们经常用到JavaBean类以及序列化的知识,但经 ...

  6. android 开发 常用工具类

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38965311,本文出自[张鸿洋的博客] 打开大家手上的项目,基本都会有一大批的辅 ...

  7. android开发网络连接工具类(一)

    网络连接工具类整理: package com.gzcivil.utils; import java.io.IOException; import java.util.ArrayList; import ...

  8. android开发Tost工具类管理(一)

    Tost工具类管理: package com.gzcivil.utils; import android.content.Context; import android.widget.Toast; / ...

  9. Android开发中Context类的作用以及Context的详细用法

    Android中Context的作用以及Context的详细用法 本文我们一起来探讨一下关于Android中Context的作用以及Context的详细用法,这对我们学习Android的资源访问有很大 ...

随机推荐

  1. SimpleDateFormat将月/日/年 时分秒转换为年-月-日 时:分:秒

    String expirTime = ”12 / 27 / 2018 12: 00: 00 AM”;SimpleDateFormat in = new SimpleDateFormat("M ...

  2. HTML5制作网页(2)

     <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title> ...

  3. oracle data type

    NUMBER ( precision, scale) precision表示数字中的有效位.如果没有指定precision的话,Oracle将使用38作为精度. scale表示数字小数点右边的位数,s ...

  4. 跳台阶(JAVA)

    跳台阶 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路:典型的动态规划问题,动态规划问题最关键的是把事件中的各种情形抽象为状态,然后找到前后 ...

  5. winscp工具和xshell连接linux机器时切换到root账户

    由于工作中一些机器不能以root直接登陆(sshd_config配置了不能直接root登陆),但是又想连接的时候切换为root用户 处理方式 1.给普通用户sudo su - 权限 命令行输入visu ...

  6. pycharm操作

  7. php获取数组最后一个值

    $array = array(1,2,3,4,5);

  8. VS调试快捷键配置更改

    VS进行调试时,默认情况下需按下Fn+F5等组合按键,手短的用起来很不便利 如何去掉组合键只按下F5? 解决:即按下Fn+Esc,然后就可以直接按下F1-F12使用VS的快捷键,如果想回到组合键也是同 ...

  9. IntellijIDEA常用快捷键总结

    转载自:http://blog.csdn.net/qq_17586821/article/details/52554731 下面的这些常用快捷键需要在实际操作中不断地体会才能真正感受到它们的方便之处. ...

  10. libvirt启动报错Failed to start Virtualization daemon

    libvirt启动报错Failed to start Virtualization daemon 1.启动libvirt的具体报错如下 [root@localhost IOS]# service li ...