Android中使用Timer和TimerTask
前言
近期有個需求,要每隔一段時間,應用向後臺傳送一些資料,用作統計,這時可以使用Java提供的計時器的工具類,即Timer和TimerTask來實現這一功能。
簡介
Timer是一個普通的類,其中有幾個重要的方法;而TimerTask則是一個抽象類,其中有一個抽象方法run(),類似執行緒中的run()方法,我們使用Timer建立一個他的物件,然後呼叫schedule方法來完成這種間隔的操作。
這裡用到的這個schedule方法有三個引數:
第一個引數就是TimerTask物件,我們實現TimerTask的run()方法就是要週期執行的一個任務;
第二個引數是延遲執行的時間
第三個引數就是執行的週期,為long型別,也就是說第一次呼叫之後,從第二次開始每隔多長的時間呼叫一次 run() 方法。
schedule方法還有一種兩個引數的執行過載,第一個引數仍然是TimerTask,第二個表示為long的形式表示多長時間後執行一次,為Date就表示某個時間後執行一次。
Java API:
//Schedules thespecified task for execution after the specifieddelay
schedule(TimerTask task, long delay)//在延時delay毫秒後執行task。並沒有提到重複執行
//Schedulesthe specified task for repeated fixed-delay execution, beginningafter the specified delay
schedule(TimerTask task, long delay, long period)//在延時delay毫秒後重復的執行task,週期是period毫秒。
Timer就是一個執行緒,使用schedule方法完成對TimerTask的排程,多個TimerTask可以共用一個Timer,也就是說Timer物件呼叫一次schedule方法就是建立了一個執行緒,並且呼叫一次schedule後TimerTask是無限制的迴圈下去的,使用Timer的cancel()停止操作。當然同一個Timer執行一次cancel()方法後,所有Timer執行緒都被終止。
另外Timer類還有一個排程方法scheduleAtFixedRate(),這個方法的引數與schedule()相同,具體的區別在下邊再說!
使用
//true 說明這個timer以daemon方式執行(優先順序低,程式結束timer也自動結束)
Timer timer = new Timer(true);
TimerTask task = new TimerTask() {
public void run() {
//每次需要執行的程式碼放到這裡面。
}
};
//以下是幾種排程task的方法:
//time為Date型別:在指定時間執行一次。
timer.schedule(task, time);
//firstTime為Date型別,period為long,表示從firstTime時刻開始,每隔period毫秒執行一次。
timer.schedule(task, firstTime, period);
//delay 為long型別:從現在起過delay毫秒執行一次。
timer.schedule(task, delay);
//delay為long,period為long:從現在起過delay毫秒以後,每隔period毫秒執行一次。
timer.schedule(task, delay, period);
兩種排程方法的區別
①啟動時間在指定時間之後(呼叫方法在設定的開始執行時間之後):
schedule()不會將過去的時間計算在內
SimpleDateFormat fTime = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date d1 = fTime.parse("2016/11/08 17:10:00");
timer.schedule(new TimerTask(){
public void run(){
System.out.println("this is task running");
}
},d1,3*60*1000);
如果是在2016/11/08 17:20執行程式,則會在2016/11/08 17:23輸出第一條:this is task running
scheduleAtFixedRate()會將過去的時間計算在內
SimpleDateFormat fTime = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date d1 = fTime.parse("2016/11/08 17:10:00");
timer.scheduleAtFixedRate(new TimerTask(){
public void run(){
System.out.println("this is task running");
}
},d1,3*60*1000);
如果是在2016/11/08 17:20執行程式,則會快速輸出三條:this is task running,第四條將會在2016/11/08 17:22輸出,而不是 17:23!就是說是從指定的開始時間開始計時,而不是從執行時間開始計時。
②任務延遲時的處理不同
schedule如果由於任何原因(如垃圾回收或其他後臺活動)而延遲了某次執行,則後續執行也將被延遲。
schedule適用於那些需要“平穩”執行的重複活動。如以固定時間間隔閃爍的游標。
scheduleAtFixedRate如果由於任何原因(如垃圾回收或其他後臺活動)而延遲了某次執行,則將快速連續地出現兩次或更多的執行,從而使後續執行能夠“追趕上來”。
scheduleAtFixedRate適用於那些對絕對時間敏感的重複執行活動,如每小時準點打鐘報時,或者在每天的特定時間執行已安排的維護活動。
題外話:
JDK 5.0以後推薦使用ScheduledThreadPoolExecutor,該類屬於Executor Framework,它除了能處理異常外,還可以建立多個執行緒解決上面的問題。
相關推薦
Java 中Timer和TimerTask 定時器和定時任務使用的例子
這兩個類使用起來非常方便,可以完成我們對定時器的絕大多數需求 Timer類是用來執行任務的類,它接受一個TimerTask做引數 Timer有兩種執行任務的模式,最常用的是schedule,它可以以兩種方式執行任務:1:在某個時間(Data),2:在某個固定的時間之後(i
Android 中Timer和TimeTask完成定時任務
1. Timer 用法 new Timer().schedule(new TimerTask(){ @Override publicvoid run() { // TODO Auto-generated method stub // do some your own process whe
Android中定時器Timer和TimerTask的啟動,停止,暫停,繼續等操作例項
下面是一個在Android中使用定時器Timer和TimerTask的啟動,停止,暫停,繼續等操作的demo。 需要注意的問題主要有兩點: 1、Timer和TimerTask在呼叫cancel()取消後不能再執行 schedule語句,否則提示出錯,提示如下:D/Andro
Android中使用Timer和TimerTask
前言 近期有個需求,要每隔一段時間,應用向後臺傳送一些資料,用作統計,這時可以使用Java提供的計時器的工具類,即Timer和TimerTask來實現這一功能。 簡介 Timer是一個普通的類,其中有幾個重要的方法;而TimerTask則是一個抽象類
Java中的Timer和TimerTask在Android中的用法
在開發中我們有時會有這樣的需求,即在固定的每隔一段時間執行某一個任務。比如UI上的控制元件需要隨著時間改變,我們可以使用Java為我們提供的計時器的工具類,即Timer和TimerTask。 Timer是一個普通的類,其中有幾個重要的方法;而TimerTask則是一個抽象
Android中getDrawable和getColor過時的替代方法
this logs con 知識 log launcher 16px ase spa 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 前言 Android SDK 升級到 23 之後,getDrawable和getColor方法提示過時。 解決方案 getRe
Android中 Bitmap和Drawable相互轉換的方法
canvas board null height .com factory oar tool pla 1、Drawable --> Bitmap [java] view plain copy Bitmap drawable2Bitmap(Drawabl
Android中Gallery和ImageSwitcher同步自動(滾動)播放圖片庫
目標 art trac repl otto fin instance img com 本文主要內容是如何讓Gallery和ImageSwitcher控件能夠同步自動播放圖片集 ,看起來較難,然而,實現的方法非常簡單, 請跟我慢慢來。總的來說,本文要實現的效果如下圖:(截
Android中RelativeLayout和LinearLayout性能分析
ant 顯示 二次 iou other comm 排列 vertica 簡單的 先看一些現象吧:用eclipse或者Android studio,新建一個Activity自動生成的布局文件都是RelativeLayout,或許你會認為這是IDE的默認設置問題,其實不然,
Java並發編程:Timer和TimerTask(轉載)
為什麽 www isempty com 空間 continue 可執行 rate 一般來說 下面內容轉載自: http://blog.csdn.net/xieyuooo/article/details/8607220 其實就Timer來講就是一個調度器,而Time
Android中Service和IntentService的差別
前言: ServiceTimeout(20 seconds)小概率型別Service在特定的時間內無法處理完成,會造成ANR — 應用程式無響應(ANR:Application Not Responding)的情況 ▲ 分析 : 避免ANR最核心的一點就是在主執行緒減少耗時操作。這時我們
Android中Serializable和Parcelable序列化物件詳解
學習內容: 1.序列化的目的 2.Android中序列化的兩種方式 3.Parcelable與Serializable的效能比較 4.Android中如何使用Parcelable進行序列化操作 5.Parcelable的工作原理 6.相關例項 1.序列化
Timer和TimerTask定時器使用
Timer是一種定時器工具,用來在一個後臺執行緒計劃執行指定任務。它可以計劃執行一個任務一次或反覆多次。 TimerTask一個抽象類,它的子類代表一個可以被Timer計劃的任務。具體的任務在TimerTask中run介面中實現。 通過Timer中的schedule方法啟動定
Android 中src和background的區別
XML屬性中src和background的區別: src會存放原圖的大小,background會根據view的大小拉伸整張圖片。src是前景而background是背景。 可以使用scaleType屬性設定src(只對src起作用)的縮放方式。 詳細的scaleType說明: CEN
Android中activity和xml的第一個專案
我們使用的手機不光是隻用到一個應用程式,比如在淘寶介面要付款的時候可能會啟動微信付款等,這就相當於在淘寶的Activity中啟動了微信的Activity。還比如說當我們註冊一個網站是,可能會給自己傳送一條簡訊作為驗證,這就是在當前的Activity中啟動了簡訊的Activity。之前對比的MVC設
Android中Paint和Canvas的簡單使用
在 Android 中,Canvas 相當於畫布,而 Paint 相當於畫筆;那麼這兩個配合使用就可以畫出來我們想要的形狀了。 首先我們新建一個類,名字叫 MyView,重寫 onDraw() 方法,程式碼如下: @SuppressLint("AppCompatCustomView") pu
android中 IMEI和ICCID的校驗位計算
我們都知道在android 中有IMEI和ICCID 這兩項資料. 至於這兩項資料的獲取方式以及所表示的意思在此我就不寫了.主要講講這兩項資料最後一位的校驗位如何計算的. IMEI共1
16-Java併發程式設計:Timer和TimerTask(轉載)
Java併發程式設計:Timer和TimerTask(轉載) 下面內容轉載自: 其實就Timer來講就是一個排程器,而TimerTask呢只是一個實現了run方法的一個類,而具體的TimerTask需要由你自己來實現,例如這樣: Timer timer =
Android-0.Android中minsdkversion和targetSdkVersion的選擇
問題 在呼叫系統播放mp4時,程式碼如下: private void viewMediaFile(String path) { if (!TextUtils.isEmpty(path)) { String type =
android中stagefright和OMXCodec原理分析
1. 框架結構 1.1StageFright和openCore和NuPlayer的關係 上圖可知,stagefright是在MediaPlayerService這一層加入的,和opencZ喎�"/kf/ware/vc/" target="_blank" class=