android定時任務的優劣

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最簡單的實現)

  1. 定義一個Handler類
Handler handler=new Handler();  
Runnable runnable=new Runnable() {  
    @Override  
    public void run() {  
        // TODO Auto-generated method stub  
        //要做的事情  
        handler.postDelayed(this, 2000);  
    }  
};  
  1. 啓動計時器
handler.postDelayed(runnable, 2000);//每兩秒執行一次runnable.  
  1. 停止計時器
handler.removeCallbacks(runnable);可以在不用的時候及時停止線程

採用Handler與timer及TimerTask結合的方法(比較多的任務時建議使用)

  1. 定義定時器、定時器任務及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);  
    }  
};  
  1. 初始化計時器任務
    [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);  
    }  
};   
  1. 啓動定時器
timer.schedule(task, 2000, 2000);   
  1. 停止計時器
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)

發佈了33 篇原創文章 · 獲贊 6 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章