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.pswp.cn/news/260414.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260414.shtml
英文地址,請注明出處:http://en.pswp.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還提供了直接對…