1. 程式人生 > >Android中使用Timer和TimerTask

Android中使用Timer和TimerTask

前言

近期有個需求,要每隔一段時間,應用向後臺傳送一些資料,用作統計,這時可以使用Java提供的計時器的工具類,即Timer和TimerTask來實現這一功能。

簡介

Timer是一個普通的類,其中有幾個重要的方法;而TimerTask則是一個抽象類,其中有一個抽象方法run(),類似執行緒中的run()方法,我們使用Timer建立一個他的物件,然後呼叫schedule方法來完成這種間隔的操作。
這裡用到的這個schedule方法有三個引數:
第一個引數就是TimerTask物件,我們實現TimerTask的run()方法就是要週期執行的一個任務;
第二個引數是延遲執行的時間

,有兩種型別,第一種是long型別,表示多長時間後開始執行,也就是說使用者呼叫 schedule() 方法後,要等待這麼長的時間才可以第一次執行run() 方法。另一種是Date型別,表示從那個時間後開始執行;
第三個引數就是執行的週期,為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 TimerTimerTask 定時器定時任務使用的例子

這兩個類使用起來非常方便,可以完成我們對定時器的絕大多數需求 Timer類是用來執行任務的類,它接受一個TimerTask做引數 Timer有兩種執行任務的模式,最常用的是schedule,它可以以兩種方式執行任務:1:在某個時間(Data),2:在某個固定的時間之後(i

Android TimerTimeTask完成定時任務

1. Timer 用法 new Timer().schedule(new TimerTask(){   @Override publicvoid run() {   // TODO Auto-generated method stub // do some your own process whe

Android定時器TimerTimerTask的啟動,停止,暫停,繼續等操作例項

下面是一個在Android中使用定時器Timer和TimerTask的啟動,停止,暫停,繼續等操作的demo。 需要注意的問題主要有兩點: 1、Timer和TimerTask在呼叫cancel()取消後不能再執行 schedule語句,否則提示出錯,提示如下:D/Andro

Android使用TimerTimerTask

前言 近期有個需求,要每隔一段時間,應用向後臺傳送一些資料,用作統計,這時可以使用Java提供的計時器的工具類,即Timer和TimerTask來實現這一功能。 簡介 Timer是一個普通的類,其中有幾個重要的方法;而TimerTask則是一個抽象類

JavaTimerTimerTaskAndroid的用法

在開發中我們有時會有這樣的需求,即在固定的每隔一段時間執行某一個任務。比如UI上的控制元件需要隨著時間改變,我們可以使用Java為我們提供的計時器的工具類,即Timer和TimerTask。  Timer是一個普通的類,其中有幾個重要的方法;而TimerTask則是一個抽象

AndroidgetDrawablegetColor過時的替代方法

this logs con 知識 log launcher 16px ase spa 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 前言 Android SDK 升級到 23 之後,getDrawable和getColor方法提示過時。 解決方案 getRe

Android BitmapDrawable相互轉換的方法

canvas board null height .com factory oar tool pla 1、Drawable --> Bitmap [java] view plain copy Bitmap drawable2Bitmap(Drawabl

AndroidGalleryImageSwitcher同步自動(滾動)播放圖片庫

目標 art trac repl otto fin instance img com 本文主要內容是如何讓Gallery和ImageSwitcher控件能夠同步自動播放圖片集 ,看起來較難,然而,實現的方法非常簡單, 請跟我慢慢來。總的來說,本文要實現的效果如下圖:(截

AndroidRelativeLayoutLinearLayout性能分析

ant 顯示 二次 iou other comm 排列 vertica 簡單的 先看一些現象吧:用eclipse或者Android studio,新建一個Activity自動生成的布局文件都是RelativeLayout,或許你會認為這是IDE的默認設置問題,其實不然,

Java並發編程:TimerTimerTask(轉載)

為什麽 www isempty com 空間 continue 可執行 rate 一般來說 下面內容轉載自:   http://blog.csdn.net/xieyuooo/article/details/8607220   其實就Timer來講就是一個調度器,而Time

AndroidServiceIntentService的差別

前言: ServiceTimeout(20 seconds)小概率型別Service在特定的時間內無法處理完成,會造成ANR — 應用程式無響應(ANR:Application Not Responding)的情況 ▲ 分析 : 避免ANR最核心的一點就是在主執行緒減少耗時操作。這時我們

AndroidSerializableParcelable序列化物件詳解

學習內容: 1.序列化的目的 2.Android中序列化的兩種方式 3.Parcelable與Serializable的效能比較 4.Android中如何使用Parcelable進行序列化操作 5.Parcelable的工作原理 6.相關例項   1.序列化

TimerTimerTask定時器使用

Timer是一種定時器工具,用來在一個後臺執行緒計劃執行指定任務。它可以計劃執行一個任務一次或反覆多次。  TimerTask一個抽象類,它的子類代表一個可以被Timer計劃的任務。具體的任務在TimerTask中run介面中實現。  通過Timer中的schedule方法啟動定

Android srcbackground的區別

XML屬性中src和background的區別: src會存放原圖的大小,background會根據view的大小拉伸整張圖片。src是前景而background是背景。 可以使用scaleType屬性設定src(只對src起作用)的縮放方式。 詳細的scaleType說明: CEN

Androidactivityxml的第一個專案

我們使用的手機不光是隻用到一個應用程式,比如在淘寶介面要付款的時候可能會啟動微信付款等,這就相當於在淘寶的Activity中啟動了微信的Activity。還比如說當我們註冊一個網站是,可能會給自己傳送一條簡訊作為驗證,這就是在當前的Activity中啟動了簡訊的Activity。之前對比的MVC設

AndroidPaintCanvas的簡單使用

在 Android 中,Canvas 相當於畫布,而 Paint 相當於畫筆;那麼這兩個配合使用就可以畫出來我們想要的形狀了。 首先我們新建一個類,名字叫 MyView,重寫 onDraw() 方法,程式碼如下: @SuppressLint("AppCompatCustomView") pu

android IMEIICCID的校驗位計算

        我們都知道在android 中有IMEI和ICCID 這兩項資料. 至於這兩項資料的獲取方式以及所表示的意思在此我就不寫了.主要講講這兩項資料最後一位的校驗位如何計算的.         IMEI共1

16-Java併發程式設計:TimerTimerTask(轉載)

Java併發程式設計:Timer和TimerTask(轉載)   下面內容轉載自:   其實就Timer來講就是一個排程器,而TimerTask呢只是一個實現了run方法的一個類,而具體的TimerTask需要由你自己來實現,例如這樣: Timer timer =

Android-0.AndroidminsdkversiontargetSdkVersion的選擇

問題 在呼叫系統播放mp4時,程式碼如下: private void viewMediaFile(String path) { if (!TextUtils.isEmpty(path)) { String type =

androidstagefrightOMXCodec原理分析

1. 框架結構 1.1StageFright和openCore和NuPlayer的關係 上圖可知,stagefright是在MediaPlayerService這一層加入的,和opencZ喎�"/kf/ware/vc/" target="_blank" class=