Timer计时任务因系统时间的修改导致挂起解决方案
2014-10-24 16:35
330 查看
之前开发的一款运行在定制Android设备上的一个实时监控程序发生了一个很奇怪的问题:关机状态下放置了半个月左右的时间之后,再次开机使用,使用到一半的时候,显示界面就卡死在某一个状态下了(显示界面只显示一行文字,代表当前的状态)。取到的log信息里没有任何错误信息,测试也很难再现问题(因为条件较难满足,关机状态下放置半个月)。之后就各种查问题......
终于找到是Timer的问题:如果在启动一个Timer任务之后,进行了系统时间的修改操作,包括系统自动同步网络时间,都有可能导致这个Timer任务挂起。
系统时间修改到当前时间之后,不会影响Timer的执行;但是如果系统时间修改到当前时间之前,就会导致Timer挂起。详见博文:“关于Timer运行时修改系统时间”。
要解决这个问题的话,需要程序在系统时间改变之后主动重启Timer,Android系统在系统时间被修改之后,会发出一条广播:Intent.ACTION_TIME_CHANGED,我们只需要监听这个广播即可。
在onCreate方法或者其它合适的地方注册广播监听方法:
然后实现广播监听器:
具体的Timer重启方法放在了Handle中:
firstTask代码如下:
通过以上这种方式就可以解决在修改了系统时间后Timer被挂起的问题。
终于找到是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被挂起的问题。
相关文章推荐
- java中Timer因修改系统时间致使任务被挂起的原因
- Timer定时器因修改系统时间导致挂起的原因
- 修改系统时间导致myeclipse不能自动发布的解决方法
- 【开发过程问题汇总系列】【定时器】Timer运行的过程中把系统时间修改为以前的时间会停止运行的问题
- 测试timeTask定时执行任务线程,修改系统时间测试的技巧
- 修改系统时间后Spring定时任务失效,重启服务后才生效
- Slickedit 导致系统挂起或死机的解决方案
- 修改系统时间,导致百度上不去
- 修改系统时间导致DB2报错SQL0903N,RC=2
- 由于系统时间修改导致Oracle启动失败
- 修改PATH导致进不去系统 解决方案
- linux系统修改系统时间重启后导致文件系统错误原因以及修复方法
- Linux时间修改导致的系统启动问题
- 修改本地系统时间导致的一系列问题
- Linux下定时任务修改系统时间
- TimerTask在遇到修改系统时间不能正常工作,自己写一个简单的TimerTask和Timer
- 解决修改系统时间后Spring 定时任务不执行
- linux中用命令修改系统时间
- 病毒针对杀毒软件特性对系统时间进行修改
- 遭遇修改系统时间、使用映像劫持的xibgptd.exe,netdde32.exe等3