android 开启一个定时线程_Android 定时任务刷新的多种实现方式

1.采用Handle与线程的sleep(long)方法

1) 定义一个Handler类,用于处理接受到的Message。

Handler handler = new Handler() {

public void handleMessage(Message msg) {

// 要做的事情

super.handleMessage(msg);

}

};

2) 新建一个实现Runnable接口的线程类,如下:

public class MyThread implements Runnable {

@Override

public void run() {

// TODO Auto-generated method stub

while (true) {

try {

Thread.sleep(10000);// 线程暂停10秒,单位毫秒

Message message = new Message();

message.what = 1;

handler.sendMessage(message);// 发送消息

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

3) 在需要启动线程的地方加入下面语句:

new Thread(new MyThread()).start();

分析:纯正的java原生实现,在sleep结束后,并不能保证竞争到cpu资源,这也就导致了时间上必定>=10000的精度问题。

2.采用Handler的postDelayed(Runnable, long)方法

1)定义一个Handler类

Handler handler=new Handler();

Runnable runnable=new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

//要做的事情

handler.postDelayed(this, 2000);

}

};

1

2

3

4

5

6

7

8

9

10

11

2) 启动与关闭计时器

handler.postDelayed(runnable, 2000);//每两秒执行一次runnable.

1

handler.removeCallbacks(runnable);

1

分析:嗯,看起蛮不错,实现上也简单了,和sleep想必还不会产生阻塞,注意等待和间隔的区别。

3.采用Handler与timer及TimerTask结合的方法

1) 定义定时器、定时器任务及Handler句柄

private final Timer timer = new Timer();

private TimerTask task;

Handler handler = new Handler() {

@Override

public void handleMessage(Message msg) {

// TODO Auto-generated method stub

// 要做的事情

super.handleMessage(msg);

}

};

1

2

3

4

5

6

7

8

9

10

11

2) 初始化计时器任务

task = new TimerTask() {

@Override

public void run() {

// TODO Auto-generated method stub

Message message = new Message();

message.what = 1;

handler.sendMessage(message);

}

};

1

2

3

4

5

6

7

8

9

3) 启动和关闭定时器

timer.schedule(task, 2000, 3000);

1

timer.cancel();

1

此外,Timer也可以配合runOnUiThread实现,如下

private TimerTask mTimerTask = new TimerTask() {

@Override

public void run() {

runOnUiThread(new Runnable() {

@Override

public void run() {

//处理延时任务

}

});

}

};

1

2

3

4

5

6

7

8

9

10

11

12

分析:timer.schedule(task, 2000, 3000);意思是在2秒后执行第一次,之后每3000秒在执行一次。timer不保证精确度且在无法唤醒cpu,不适合后台任务的定时。

采用AlarmManger实现长期精确的定时任务

AlarmManager的常用方法有三个:

set(int type,long startTime,PendingIntent pi);//一次性

setExact(int type, long triggerAtMillis, PendingIntent operation)//一次性的精确版

setRepeating(int type,long startTime,long intervalTime,PendingIntent

pi);//精确重复

setInexactRepeating(int type,long startTime,long

intervalTime,PendingIntent pi);//非精确,降低功耗

type表示闹钟类型,startTime表示闹钟第一次执行时间,long intervalTime表示间隔时间,PendingIntent表示闹钟响应动作

对以上各个参数的详细解释

闹钟的类型:

AlarmManager.ELAPSED_REALTIME:休眠后停止,相对开机时间

AlarmManager.ELAPSED_REALTIME_WAKEUP:休眠状态仍可唤醒cpu继续工作,相对开机时间

AlarmManager.RTC:同1,但时间相对于绝对时间

AlarmManager.RTC_WAKEUP:同2,但时间相对于绝对时间

AlarmManager.POWER_OFF_WAKEUP:关机后依旧可用,相对于绝对时间

绝对时间:1970 年 1月 1 日 0 点

startTime:

闹钟的第一次执行时间,以毫秒为单位,一般使用当前时间。

SystemClock.elapsedRealtime():系统开机至今所经历时间的毫秒数

System.currentTimeMillis():1970 年 1 月 1 日 0 点至今所经历时间的毫秒数

intervalTime:执行时间间隔。

PendingIntent :

PendingIntent用于描述Intent及其最终的行为.,这里用于获取定时任务的执行动作。

详细参考译文:PendingIntent

利用AlarmManger+Service+BarocastReceiver实现5s一次打印操作

服务类:

public class HorizonService extends Service {

@Override

public IBinder onBind(Intent intent) {

return null;

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

new Thread(new Runnable() {

@Override

public void run() {

Log.d("TAG", "打印时间: " + new Date().

toString());

}

}).start();

AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);

int five = 5000; // 这是5s

long triggerAtTime = SystemClock.elapsedRealtime() + five;

Intent i = new Intent(this, AlarmReceiver.class);

PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);

manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);

return super.onStartCommand(intent, flags, startId);

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

广播接受器

public class AlarmReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

Intent i = new Intent(context, HorizonService.class);

context.startService(i);

}

}

1

2

3

4

5

6

7

启动定时任务:

Intent intent = new Intent(this,HorizonService.class);

startService(intent);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统安全防护之UNIX下***检测方法

因为UNIX系统经常承当着关键任务,所以它经常是***者***的首选目标。于是检测***、保护系统安全是管理员的最为重要的任务之一。那么,在没有其它工具帮助的情况下,如何去判断系统当前的安全性?如何去发现***呢?下面给大家介绍一些常…

在Windows上安装Docker

背景Windows的Docker桌面是Microsoft Windows的Docker的社区版本。您可以从Docker Hub下载适用于Windows的Docker桌面。该页面包含有关在Windows 10 Pro,Enterprise和Education上安装Docker Desktop的信息。如果要查找有关在Windows 10 Home上安装Docker桌面的信息.…

全景图解高铁数据,谁是最有潜力的高铁城市?

经过十年的快速发展,高铁已成为人们日常出行的重要交通工具,“千里江陵一日还”早已变成现实,高铁改变的不仅是不断刷新的“中国速度”,更为区域与城市发展带来新的模式与机遇。高铁以高速、大容量、集约型、通勤化的特征&#xf…

对MATLAB课程教程的建议,关于MATLAB课程教学的几点探讨

练习。另一方面,对于如解线性方程组、求函数的极限、导数和数值积分等大量Matlab函数和指令的运用,不需要花过多的时间跟学生讲解,可以让学生自己查看Matlab的帮助文档,并上机练习。Matlab提供了几乎包含其所有内容和功能的在线帮…

原型链的理解_javascript之快速理解(原型链)

希望通过比较通俗易懂的讲解和简短的文字,让大家能快速理解什么是原型链,如果有不对的地方也请各位大佬快速纠正,一起共勉,使我们初学者快速进阶!话不多说,我们切入正题,按着我的步骤一步一步往…

VMware的网卡设置模式

Bridge:这种方式最简单,直接将虚拟网卡桥接到一个物理网卡上面,和linux下一个网卡 绑定两个不同地址类似,实际上是将网卡设置为混杂模式,从而达到侦听多个IP的能力. 在此种模式下,虚拟机内部的网卡(例如linux下的eth0)直接连到了物理网卡所在的网络上,可以想象为虚拟机和host机…

如何轻松将上亿的数据玩弄于股掌之中?

在日常生活中,我们经常会遇到排序问题:在打扑克牌的时候,原本拿到手上的牌是乱序的,我们会按照自己喜好的顺序一张一张排好手上的牌,最后看起来是顺眼的。比如小智打扑克牌会将自己手上的牌排成这样:小智排…

帮助阅读源码的8个技巧

大家好,我是Z哥。之前写了一篇关于阅读源码到底有多少价值的文章《阅读源码的真正价值》,反响还不错。在文中我向你阐明了阅读源码5个价值。面试在工作中更快地上手新项目给自己创造用新技术的机会完善知识体系学习别人的设计思路那么今天我就和你来聊聊…

php webshell开源,[github开源]webshell连接器--Jeshell

前言:以前连接webshell都是用一个好朋友写的Webshellsniper,但是昨天使用webshellsniper测试的时候,发现不能支持shell_exec()这个php函数,问了一下才知道,他写的默认是只用eval()和assert()函数的webshell。于是&…

robcad和catia是什么关系_proe/CATIA/UG/SolidWorks软件区别与联系

proe/CATIA/UG/SolidWorks软件区别与联系相信你一定清楚proe软件的用途,其实它在机械设计上面的应用也是非常广泛,与CATIA、UG、SolidWorks软件一样,这四大软件可谓是在机械设计应用非常广泛的软件,几乎在这个行业里的设计师无外乎…

活动目录组策略统一管理桌面

使用组策略实现企业统一桌面 在企业中为了实现企业形象的统一性,会要求在企业所有计算机上实现标准的桌面化配置环境。1、统一桌面壁纸在域控上建立存放背景图片的文件夹,将其设置为共享文件夹; 然后在开始—运行中GPedit.msc命令进入…

Kubernetes中分布式存储Rook-Ceph部署快速演练

最近在项目中有涉及到Kubernetes的分布式存储部分的内容,也抽空多了解了一些。项目主要基于Rook-Ceph运行,考虑到Rook-Ceph部署也不那么简单,官方文档的步骤起点也不算低,因此,在整合官方文档的某些步骤的基础上&#…

MATLAB向量化函数 举例,MatLab-向量化技巧

《MatLab-向量化技巧》由会员分享,可在线阅读,更多相关《MatLab-向量化技巧(10页珍藏版)》请在人人文库网上搜索。1、MatLab 向量化技巧家家 2007-05-17 13:53大家都知道MatLab是一种解释性语言,它的长处在矩阵运算。因此需要将问题尽量用矩阵…

IT人的八大修炼神器

看到2018年的KPI,你是否感到崩溃?在这个充满竞争的时代,你需要用最有效的方式,学习最有用的知识,来提高自身技能。小编特意为大家准备IT人的八大修炼神器,推荐能帮助我们提升技术的公众号,欢迎大…

hotelling t2 matlab,pca主成份分析方法

1.应用pca的前提应用pca的前提是,连续信号具有相关性。相关性是什么,是冗余。就是要利用pca去除冗余。2.pca的定义pca是一种去除随机变量间相关性的线性变换。是一种常用的多元数据分析方法。pca将互相关的输入数据转换成统计上不相干的主成分(或者特征)…

如何在 WebAPI 中启用 CORS

浏览器安全策略上的安全限制可以有效的阻止 Ajax 向另外一个域server发起请求,这就是著名的 同源策略,那如何突破这种限制呢?可以使用 CORS (Cross-Origin Resource Sharing) 跨域资源共享来解决此类问题,它…

Kappa信息化谋局电子商务与传统渠道的全面管理

近日,Kappa中国总经理任轶先生与淘宝网首席财务官兼淘宝商城负责人张勇先生会晤于杭州淘宝总部,就淘宝网与Kappa的电子商务战略合作达成全面共识。非常注重企业信息化建设的Kappa在积极推进电子商务的同时,也早早的把电子商务模式下的信息化建…

druid字段级_Druid的数据结构

Druid的数据结构Druid数据存储结构可以分为三层: 1. DataSource 2. Chunk 3. SegmentDataSource相当于传统数据库的按时间分区的表,Chunk相当于MySQL中的按时间分区的表一个分区,但是Chunk不是一个实体,只是一个虚拟的概念&#x…

数据分析师+做过名企项目+懂运营+985毕业=跳槽失败?

数据已经成为很多企业的重要资源,数据分析已经成为了各行业的指导军事,但是数据分析师的工作从来都不是容易的。如今,数据分析师是一个互联网从业人士转型最快捷的入门职位,人工智能、大数据都要依附于数据分析。很多人也因为前途…

matlab 如何画二维图形,Matlab 学习 画图篇 一 二维图形

matlab给绘制二维图形提供了很多的函数,把一些绘制二维图形的基本函数做成一张表,如下图所示:我就按照表的顺序一一记录一些个函数的简略用法。首先是1.plot函数plot函数有很多重载方法,这里只做简单的介绍1.1 plot(Y)1.1 若Y是向…