git 撤销挂起的更改_Timer计时任务因系统时间的修改导致挂起解决方案

之前开发的一款运行在定制Android设备上的一个实时监控程序发生了一个很奇怪的问题:关机状态下放置了半个月左右的时间之后,再次开机使用,使用到一半的时候,显示界面就卡死在某一个状态下了(显示界面只显示一行文字,代表当前的状态)。取到的log信息里没有任何错误信息,测试也很难再现问题(因为条件较难满足,关机状态下放置半个月)。之后就各种查问题......

终于找到是Timer的问题:如果在启动一个Timer任务之后,进行了系统时间的修改操作,包括系统自动同步网络时间,都有可能导致这个Timer任务挂起。

系统时间修改到当前时间之后,不会影响Timer的执行;但是如果系统时间修改到当前时间之前,就会导致Timer挂起。详见博文:“关于Timer运行时修改系统时间”。

要解决这个问题的话,需要程序在系统时间改变之后主动重启Timer,Android系统在系统时间被修改之后,会发出一条广播:Intent.ACTION_TIME_CHANGED,我们只需要监听这个广播即可。

在onCreate方法或者其它合适的地方注册广播监听方法:

IntentFilter filter = new IntentFilter();

filter.addAction(Intent.ACTION_TIME_CHANGED);

filter.addAction(Intent.ACTION_DATE_CHANGED);

this.registerReceiver(new TimeChangedReceiver(), filter);

然后实现广播监听器:

public class TimeChangedReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

Log.d(TAG, "---onReceive() start!---");

String action = intent.getAction();

if (Intent.ACTION_DATE_CHANGED.equals(action)) {

Log.d(TAG, "---DATE_CHANGED!---");

}

if (Intent.ACTION_TIME_CHANGED.equals(action)) {

mHandlerMsg.sendEmptyMessage(MsgType.RESTARTTIMER);

Log.d(TAG, "---TIME_CHANGED!---");

}

Log.d(TAG, "---onReceive() end!---");

}

}

具体的Timer重启方法放在了Handle中:

final static class MsgType {

...

final static int RESTARTTIMER = 7;

...

}

final Handler mHandlerMsg = new Handler(new Handler.Callback() {

...

@Override

public boolean handleMessage(Message msg) {

switch (msg.what) {

...

case MsgType.RESTARTTIMER: {

try {

timer.cancel();

} catch (Exception e) {

e.printStackTrace();

}

timer = null;

timer = new Timer();

timer.schedule(new firstTask(), 0, TIMER_INTERVAL);

}

break;

...

}

}

...

}

firstTask代码如下:

class firstTask extends TimerTask {

@Override

public void run() {

// TODO do something

}

}

通过以上这种方式就可以解决在修改了系统时间后Timer被挂起的问题。

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

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

相关文章

yii urlmanager配置post不生效_一文带你彻底学会 Git Hooks 配置

你好,我是小桔,是一个没有感情的代码崽。今天给大家介绍一下 Git Hooks,相信 Git 大家都在用吧,Git 除了用作版本控制,还有许多高级功能,Git Hooks 就是其中之一。本文环境:Git 版本&#xff1a…

Tiff – 值得你体验一下的可视化的字体对比工具

Tiff 是一款字体对比工具,可视化对比两种字体之间的差异。这是一个工具来帮助比较两种字体,同时学习排版。在这一点上,谷歌 Web 字体作为 Tiff 外部字体文件的唯一来源。由于应用程序使用的一些功能需要 HTML5 和 CSS3 支持,因此请…

[.NET] 建构子中传递子对象的对象

在设计对象继承的时候&#xff0c;父对象建构子会需要一些参数&#xff0c;这些参数可以由子对象建构子透过base关键词来提供。 namespace Test001 {public class ParentClass{// Constructorspublic ParentClass(IEnumerable<string> dataCollection){this.DataCollecti…

php基础教程(三):变量

1、php变量规则 变量以 $ 符号开头&#xff0c;其后是变量的名称变量名称必须以字母或下划线开头变量名称不能以数字开头变量名称只能包含字母数字字符和下划线&#xff08;A-z、0-9 以及 _&#xff09;变量名称对大小写敏感&#xff08;$y 与 $Y 是两个不同的变量&#xff09;…

操作系统实验文件管理_系统设计硬核知识(5)——操作系统的文件管理

操作系统对计算机的管理包括两个方面&#xff1a;硬件资源和软件资源。硬件资源的管理包括CPU 的管理、存储器的管理、设备管理等&#xff0c;主要解决硬件资源的有效和合理利用问题。软件资源包括各种系统程序、各种应用程序、各种用户程序&#xff0c;也包括大量的文档材料、…

错误 0xc0202049: 数据流任务 1: 无法在只读列“ID”中插入数据

数据库导入导出时总失败&#xff0c;错误信息如下&#xff1a; 正在验证 (错误) 消息错误 0xc0202049: 数据流任务 1: 无法在只读列“ID”中插入数据。 (SQL Server 导入和导出向导) 错误 0xc0202045: 数据流任务 1: 验证列元数据失败。 (SQL Server 导入和导出向导) 错误 0xc0…

python中的items方法_Python 字典的items()方法和iteritems()方法有什么不同?【面试题详解】...

今天爱分享给大家带来Python 字典的items()方法和iteritems()方法有什么不同?【面试题详解】&#xff0c;希望能够帮助到大家。 字典是 Python 语言中唯一的映射类型。映射类型对象里哈希键(键&#xff0c;key)和指向的对象&#xff08;值&#xff0c;value)是多对一的关系&am…

大网高级技术笔记(一)

防伪码&#xff1b;黑发不知勤学早&#xff0c;白首方悔读书迟本章目标&#xff1a;理解消化动态路由协议与OSPF协议并应用于实际工作中。第一章 动态路由协议一、按照路由执行的算法分类距离矢量路由协议&#xff1a;RIP、IGRP链路状态路由协议&#xff1a;OSPE、IS-IS二、RIP…

容器类基础篇(一)

容器类&#xff1a;用来解决数组具有固定尺寸而使得灵活性受限的问题。基本的容器类&#xff08;集合类&#xff09;有&#xff1a;List、Set、Queue、Map。 Java容器类类库的用途是用来“保存对象”&#xff0c;这分为两个不同的大类&#xff1a; 1.Collection&#xff08;集合…

阿里MySQL读写一致_阿里面试题:如何保证缓存与数据库的双写一致性?

作者&#xff1a;你是我的海啸出处&#xff1a;https://blog.csdn.net/chang384915878/article/details/86756463只要用缓存&#xff0c;就可能会涉及到缓存与数据库双存储双写&#xff0c;你只要是双写&#xff0c;就一定会有数据一致性的问题&#xff0c;那么你如何解决一致性…

反射小应用之DataTable和ListT互操作

反射小应用之DataTable和List<T>互操作 在程序中&#xff0c;往往会遇到一些小情况&#xff0c;就是数据库取出来的时候为了方便直接将数据通过存储在DataSet或DataTable中&#xff0c;这样做的一个后果是在日后的的对数据进行”细“操作时&#xff0c;就发现它可能没有L…

python适合什么样的人群_什么样的人比较适合选择Python开发+人工智能技术?

原标题&#xff1a;什么样的人比较适合选择Python开发人工智能技术&#xff1f; 互联网行业最近几年来确实成为了竞相追捧的行业&#xff0c;人工智能、大数据的不断发展让Python开发技术成为了继Java开发之后的又一热门编程语言。我们都知道&#xff0c;想要学习Python开发编程…

java 8 方法引用(method references)

1 什么是方法引用&#xff08;method references&#xff09;java 8 添加了一个很熟悉但是又很陌生的符号::。 你也许会看到这样的代码System.out::println其实就是方法引用&#xff08;method references&#xff09;。由于java 8 把方法/函数也作为第一输入参数。所以你会看到…

SWT中Button事件的几种不同写法

1&#xff0e;匿名内部类写法button.addSelectionListener(new SelectionAdapter(){Overridepublic void widgetSelected(SelectionEvent e){.....}});释&#xff1a;当button被单击时&#xff0c;底层就会检查button是否注册了相对就的监听器&#xff0c;如果有&#xff0c;底…

python中fetchall函数_python中查询数据库时fetchone()函数和fetchall()函数的区别

我们在用python操作数据库的时候,经常会碰见两个函数:fetchone()和fetchall()刚开始学习的时候可能会搞不清楚他们两个的区别其实非常简单首先fetchone()函数它的返回值是单个的元组,也就是一行记录,如果没有结果,那就会返回null其次是fetchall()函数,它的返回值是多个元组,即返…

文字对齐格式

text-align:justify; letter-spacing:5px; line-height:40px; text-indent:40px 转载于:https://www.cnblogs.com/mrcln/p/3757148.html

excel vba 从入门到精通_VBA词汇-基本元素篇

在公众号发布学习VBA需要哪些基础知识这篇文章后&#xff0c;有朋友给我们留言&#xff0c;希望可以出一份VBA基础的英语知识贴。其实相关的内容我们会在后面所对应知识点一一进行讲解&#xff0c;提前剧透其实会少很多学习未知知识的乐趣哦~ 我们会将所涉及的基础单词和其说明…

jQuery基础:remove()与 detach()区别

1、detach&#xff08;&#xff09; detach() 方法移除被选元素&#xff0c;包括所有文本和子节点。这个方法会保留 jQuery 对象中的匹配的元素&#xff0c;因而可以在将来再使用这些匹配的元素。detach() 会保留所有绑定的事件、附加的数据&#xff0c;这一点与 remove() 不同…

python保存模型 特征_Pytorch提取模型特征向量保存至csv的例子

Pytorch提取模型特征向量# -*- coding: utf-8 -*-"""dj"""import torchimport torch.nn as nnimport osfrom torchvision import models, transformsfrom torch.autograd import Variableimport numpy as npfrom PIL import Imageimport torchvi…

Matlab画图-非常具体,非常全面

Matlab画图 强大的画图功能是Matlab的特点之中的一个&#xff0c;Matlab提供了一系列的画图函数&#xff0c;用户不须要过多的考虑画图的细节&#xff0c;仅仅须要给出一些基本參数就能得到所需图形&#xff0c;这类函数称为高层画图函数。此外&#xff0c;Matlab还提供了直接对…