天天看點

android 實作毫秒定時器,Android實作定時器的五種方法執行個體詳解

一、Timer

Timer是Android直接啟動定時器的類,TimerTask是一個子線程,友善處理一些比較複雜耗時的功能邏輯,經常與handler結合使用。

跟handler自身實作的定時器相比,Timer可以做一些複雜的處理,例如,需要對有大量對象的list進行排序,在TimerTask中執行不會阻塞子線程,常常與handler結合使用,在處理完複雜耗時的操作後,通過handler來更新UI界面。

timer.schedule(task, delay,period);

task: TimerTask類型的對象,實作TimerTask的run()方法就是要周期執行的一個任務;

delay : 從定時器初始化成功 開始啟動 的延遲時間。

period:定時器的間隔時間。

第三個參數就是執行的周期,為long類型。

TimerTask task= new TimerTask() {

@Override

public void run() {

count++;

Log.i("MainActivity",count + "");

}

};

new Timer().shedule(task,0,1000);//

以下是幾種排程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);

//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);

注意: 1.taskonDestory()中取消掉,否則可能發生崩潰

2.用TimerTask定時進行某些操作的APP,即使退出了,TimerTask中依然會運作一會,但是不能長時間運作

3.對于部分手機,如果你在TimerTask直接更新了UI線程是不會報錯的,而且運作正常,但是一定注意,更新UI一定要在主線程中執行,否則排查錯誤的時候你懂得。而且這個東西特别耗電,特别耗電,特别耗電,重要的事情說三遍,一定在不使用的時候關閉

二 、CountDownTimer

CountDownTimer cdt = new CountDownTimer(10000, 100) {

@Override

public void onTick(long millisUntilFinished) {

tv_hello.setText(millisUntilFinished + "");

}

@Override

public void onFinish() {

}

};

cdt.start();

onTick中的方法一次

直到執行完10000/100次為止,最後會執行onFinish()

三、 AlarmManager

Intent intent2 = newIntent(ReadLogService.this,TestBroadcast.class);

PendingIntent pd=PendingIntent.getBroadcast(getApplicationContext(),0,intent2,PendingIntent.FLAG_ONE_SHOT);

AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);

long triggerTime =SystemClock.elapsedRealtime() + 5*1000;

am.set(AlarmManager.ELAPSED_REALTIME,triggerTime, pd);

上面就是定時器的基本用法,先擷取manager,然後定義鬧鐘的flag,循環時間,到指定時間發出的pendingIntent。

一般都發出的pendingIntent都是廣播,我們自定義一個廣播接收器,就可以通過接收這個廣播,來處理自己的功能邏輯了。

這裡需要注意在獨立程序中配置,這是android所定義的

1,Alarm定時不需要程式自身去維護,而又系統來維護,使得程式更好避免了容易出錯問題,更是占用系統資源,cpu占有率。

2,即使程式退出後,程式自身不會有任何煩惱的問題,系統到時間自動調用對應元件執行定義好的邏輯

3,定時的多樣性,包括一次定時,循環定時(在xx年x月x日執行,周一至周五執行,每天幾點幾分執行。。。)

四、 handler

Handler可以幫助我們在子線程中操作UI線程,例如子線程解析資料,解析結束後通知UI重新整理界面。他本身也可以實作定時器。

private Handler handler = Handler() {

public handleMessage(android.os.Message msg) {

switch (msg.what) {

:

// 移除所有的msg.what為0等消息,保證隻有一個循環消息隊列再跑

handler.removeMessages();

// app的功能邏輯處理

...

// 再次發出msg,循環更新

handler.sendEmptyMessageDelayed(, );

break;

:

// 直接移除,定時器停止

handler.removeMessages();

break;

default:

break;

}

};

};

隻要在啟動定時器的時候,Handler.sendEmptyMessage(0),定時器就啟動了。繼續循環和停止的方法,注釋上已經寫了。

每次循環都是在主線程中操作,避免了子線程和主線程之間的穿插互動,個人覺得比timer好控制,功能實作也很簡單。

個人覺得比較适用連續更新UI,不做複雜耗時的處理的情況,例如在播放器中,我們需要更新目前播放進度的時間的顯示,僅僅是更新了文字顯示,用handler就是個不錯的選擇。

五、Thread

Thread實作定時器是建立一個子線程,在裡面while循環,可以通過handler來更新UI。個人覺得Thread和Timer沒差別,隻是長得不一樣。

private MyThread thread;

private class MyThread extends Thread {

public boolean stop;

public () {

while (!stop) {

// 處理功能

// 通過睡眠線程來設定定時時間

{

Thread.sleep();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

};

};

private start() {

(thread == ) {

thread = MyThread();

thread.start();

}

}

private () {

(thread != ) {

thread.stop = ;

thread = ;

}

}

覺得跟Timer差不多,沒什麼特殊優點

跟Timer差不多,多線程如果考慮不周經常會出問題,經常會出現多個相同功能的線程同時存在,android本身對于子線程的使用使用數量是有限制的,而且一個app同時跑多個線程是一個很可怕的事情,是以和Timer一樣,使用的時候一定要謹慎考慮。

以上所述是小編給大家介紹的Android實作定時器的五種方法執行個體詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對腳本之家網站的支援!