git 撤销挂起的更改_Timer计时任务因系统时间的修改导致挂起解决方案
之前開(kāi)發(fā)的一款運(yùn)行在定制Android設(shè)備上的一個(gè)實(shí)時(shí)監(jiān)控程序發(fā)生了一個(gè)很奇怪的問(wèn)題:關(guān)機(jī)狀態(tài)下放置了半個(gè)月左右的時(shí)間之后,再次開(kāi)機(jī)使用,使用到一半的時(shí)候,顯示界面就卡死在某一個(gè)狀態(tài)下了(顯示界面只顯示一行文字,代表當(dāng)前的狀態(tài))。取到的log信息里沒(méi)有任何錯(cuò)誤信息,測(cè)試也很難再現(xiàn)問(wèn)題(因?yàn)闂l件較難滿(mǎn)足,關(guān)機(jī)狀態(tài)下放置半個(gè)月)。之后就各種查問(wèn)題......
終于找到是Timer的問(wèn)題:如果在啟動(dòng)一個(gè)Timer任務(wù)之后,進(jìn)行了系統(tǒng)時(shí)間的修改操作,包括系統(tǒng)自動(dòng)同步網(wǎng)絡(luò)時(shí)間,都有可能導(dǎo)致這個(gè)Timer任務(wù)掛起。
系統(tǒng)時(shí)間修改到當(dāng)前時(shí)間之后,不會(huì)影響Timer的執(zhí)行;但是如果系統(tǒng)時(shí)間修改到當(dāng)前時(shí)間之前,就會(huì)導(dǎo)致Timer掛起。詳見(jiàn)博文:“關(guān)于Timer運(yùn)行時(shí)修改系統(tǒng)時(shí)間”。
要解決這個(gè)問(wèn)題的話(huà),需要程序在系統(tǒng)時(shí)間改變之后主動(dòng)重啟Timer,Android系統(tǒng)在系統(tǒng)時(shí)間被修改之后,會(huì)發(fā)出一條廣播:Intent.ACTION_TIME_CHANGED,我們只需要監(jiān)聽(tīng)這個(gè)廣播即可。
在onCreate方法或者其它合適的地方注冊(cè)廣播監(jiān)聽(tīng)方法:
IntentFilter?filter?=?new?IntentFilter();
filter.addAction(Intent.ACTION_TIME_CHANGED);
filter.addAction(Intent.ACTION_DATE_CHANGED);
this.registerReceiver(new?TimeChangedReceiver(),?filter);
然后實(shí)現(xiàn)廣播監(jiān)聽(tīng)器:
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
}
}
通過(guò)以上這種方式就可以解決在修改了系統(tǒng)時(shí)間后Timer被掛起的問(wèn)題。
總結(jié)
以上是生活随笔為你收集整理的git 撤销挂起的更改_Timer计时任务因系统时间的修改导致挂起解决方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Vivado 使用方法
- 下一篇: android 杀 服务器,androi