android定時任務的優劣
在項目中,對於android的定時任務請求我在這方面還是有點陌生,總之來說,還是有點懶。
不過我有一個好導師,讓我這懶的習慣,越來越沒有吧
話不多說,進入主題。在網上找了文檔,看了下,android的定時任務分爲三種。
android的定時任務有三種方式
- 採用Handler與線程的sleep(long)方法
- 採Handler的postDelayed(Runnable, long)方法
- 採用Handler與timer及TimerTask結合的方法
採用Handler與線程的sleep(long)方法不建議使用(因爲是Java的方式)
handler主要用來處理接受到的消息。
1.定義一個Handler類,用於處理接受到的Message
Handler handler=new Handler(){
public void handlerMessage(Message msg){
super.handleMessage(msg);
}
}
2.新建一個實現Runnable接口的線程類
public class MyThread implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(10000);// 線程暫停10秒,單位毫秒
Message message = new Message();
message.what = 1;
handler.sendMessage(message);// 發送消息
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
3.在需要啓動線程的地方加入下面語句:
new Thread(new MyThread()).start();
啓動線程後,線程每10秒發送一次消息
不好的是:線程會一直在後臺運行,會使內存變慢。
採Handler的postDelayed(Runnable, long)方法(android最簡單的實現)
- 定義一個Handler類
Handler handler=new Handler();
Runnable runnable=new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
//要做的事情
handler.postDelayed(this, 2000);
}
};
- 啓動計時器
handler.postDelayed(runnable, 2000);//每兩秒執行一次runnable.
- 停止計時器
handler.removeCallbacks(runnable);可以在不用的時候及時停止線程
採用Handler與timer及TimerTask結合的方法(比較多的任務時建議使用)
- 定義定時器、定時器任務及Handler句柄
private final Timer timer = new Timer();
private TimerTask task;
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
// 要做的事情
super.handleMessage(msg);
}
};
- 初始化計時器任務
[java] view plaincopy
task = new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};
- 啓動定時器
timer.schedule(task, 2000, 2000);
- 停止計時器
timer.cancel();
定時器任務就是說當定時器到達指定的時間要做的工作,這裏是想Handler發送一個消息,由Handler類進行處理。
java.util.Timer.schedule(TimerTask task, long delay):這個方法是說dalay/1000秒後執行tak只執行一次。
ava.util.Timer.schedule(TimerTask task, long delay, long period):這個方法是說,delay/1000秒後執行task,然後進過period/1000秒再次執行task,這個用於循環任務,執行無數次,當然,你可以用timer.cancel();取消計時器的執行。
每一個Timer僅對應唯一一個線程。Timer不保證任務執行的十分精確。Timer類的線程安全的。
AlarmManager
看了很多的資料,大家都提到了AlarmManager這個鬧鐘的定時器。
AlarmManager是使用機制有的稱呼爲全局定時器,稱爲鬧鐘。通過對它的使用,它的作用和Timer有點相似。
都有兩種相似的用法:
在指定時長後執行某項操作,週期性的執行某項操作。
AlarmManager對象配合Intent使用,可以定時的開啓一個Activity,發送一個BroadCas或者開啓一個Service。
AlarmManager常用的方法有以下幾個:
// 取消已經註冊的與參數匹配的定時器
void cancel(PendingIntent operation)
//註冊一個新的延遲定時器
void set(int type, long triggerAtTime, PendingIntent operation)
//註冊一個重複類型的定時器
void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
//註冊一個非精密的重複類型定時器
void setInexactRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)
//設置時區
void setTimeZone(String timeZone)
定時器主要類型(type參數):
public static final int ELAPSED_REALTIME
// 當系統進入睡眠狀態時,這種類型的鬧鈴不會喚醒系統。直到系統下次被喚醒才傳遞它,該鬧鈴所用的時間是相對時間,是從系統啓動後開始計時的,包括睡眠時 間,可以通過調用SystemClock.elapsedRealtime()獲得。系統值是3 (0x00000003)。
public static final int ELAPSED_REALTIME_WAKEUP
//能喚醒系統,用法同ELAPSED_REALTIME,系統值是2 (0x00000002) 。
public static final int RTC
//當系統進入睡眠狀態時,這種類型的鬧鈴不會喚醒系統。直到系統下次被喚醒才傳遞它,該鬧鈴所用的時間是絕對時間,所用時間是UTC時間,可以通過調用 System.currentTimeMillis()獲得。系統值是1 (0x00000001) 。
public static final int RTC_WAKEUP
//能喚醒系統,用法同RTC類型,系統值爲 0 (0x00000000) 。
但是 AlarmManager一旦啓動就會一直在後臺運行(除非執行cancel方法),可以在“應用管理”中看到這個應用狀態是正在運行。 “強行停止”可以讓Alarmmanager停掉。
AlarmManager的取消:(其中需要注意的是取消的Intent必須與啓動Intent保持絕對一致才能支持取消AlarmManager)
參考文獻(http://www.tuicool.com/articles/zyI3a2U)
[參考文獻](http://www.2cto.com/kf/201311/2558
參考文獻(http://blog.csdn.net/job_dinge/article/details/7929750)42.html)42.html)