Android 延時任務 Timer簡單使用
1,介紹:
【1】Timer是一種定時器工具,用來在一個後臺執行緒計劃執行指定任務。它可以計劃執行一個任務一次或反覆多次。
【2】在Android平臺中需要反覆按週期執行方法可以使用Java上自帶的TimerTask類,TimerTask相對於Thread來說對於資源消耗的更低,除了使用Android自帶的AlarmManager使用Timer定時器是一種更好的解決方法。
【3】執行機制:
程式執行:
在初始化Timer時 ,開啟一個執行緒迴圈提取任務陣列中的任務,如果任務陣列為空,執行緒等待直到新增任務;
當新增任務時,喚醒執行緒,提取陣列中標記為1的任務,
如果該任務狀態為CANCELLED,則從陣列中刪除任務,continue ,繼續迴圈提取任務;
然後將當前時間與任務執行時間點比較 標記taskFired=executionTime<=currentTime;
taskFired =false ,說明任務執行時間還沒到,則呼叫wait等待(executionTime-currentTime) 時間長度,然後迴圈重新提取該任務;
taskFired =true,說明任務執行時間已經到了,或者過去了。繼續判斷 任務迴圈時間間隔period;period=0時,說明此次任務是非迴圈任務,直接將該任務從陣列中刪除,並將狀態置為EXECUTED,然後執行任務的run方法!
period!=0時,說明此次任務時迴圈任務,將該任務的執行時間點向前推進,具體推進時間根據呼叫的方法判斷;
如果是schedule方法,則在當前時間基礎上向前推進period時間長度;
如果是scheduleAtFixedRate方法,則在當前任務執行時間點基礎上向前推進period時間長度,最後執行任務的run方法;迴圈提取任務
2,常用方法:
//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);
3,簡單使用:
public class MainActivity extends Activity {
private Timer timer;
private TimerTask task;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
System.out.println("我執行了");
}
};
//1秒後 執行task
timer.schedule(task, 1000,1000);
}
@Override
protected void onDestroy() {
//當Activity銷燬的時候 終止計時器
timer.cancel();
task.cancel();
super.onDestroy();
}
}
4,使用timer 更新UI
public class MainActivity extends AppCompatActivity {
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
button.setText("wudi");
super.handleMessage(msg);
}
};
private Button button;
private Timer timer;
private TimerTask timerTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
//【1】建立定時器
timer = new Timer();
//【2】建立定時任務,把要做的事放在run方法裡
timerTask = new TimerTask() {
@Override
public void run() {
Message message = new Message();
handler.sendMessage(message);
}
};
//【3】定時器進行安排
timer.schedule(timerTask, 12000);
}
@Override
protected void onDestroy() {
//【4】在activity消失的時候取消任務
timer.cancel();
timerTask.cancel();
super.onDestroy();
}
}