接着上一節,此次我查看了Android的時間服務,以爲幫助很大,解決了我不少疑問,下面我就本身總結了一下,加深了本身的印象,好記性不如爛筆頭,還真講得很不錯,收下吧?看下圖如何利用線程更新UI組件ide
重點:post
1】 經過兩個類Handler 和Timer 類,結合線程裏處理UI組件的模式,把不少知識系統的梳理。線程
2】 預定時間Handler: 主要是以下3個方法來執行Runnable 對象對象
handler.post(Runnable r);
handler.postAtTime(Runnable r,long uptimeMillis);
handler.postDelayed(Runnable r,long delayMillis);blog
具體的能夠本身查看API...隊列
3】 雖然Timer和Handler 的執行任務代碼都是放在run方法裏,可是Timer是在線程中執行run方法。而Handler是將執行的動做添加到Android系統的消息隊列裏,所以:在Timer的run方法裏不可以直接訪問UI組件,由於線程內不能跨線程。要是實現的話就要利用Handler接受Message:進程
關鍵代碼以下:get
//更新UI的方法消息隊列
private void setUI() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
/**
* 這裏咱們不能直接調用UI界面的組件來更新,而應該使用Handler 來接收消息更新,這裏只要發出消息就能夠了
*/
Message message = new Message();
message.what = 1;// 能夠發送多個消息,而後Handler接受不一樣的消息響應不一樣的時間
handler.sendMessage(message);
}
}, 0, 500);// 間隔0.5秒,沒有延遲當即執行任務
}it
/** 利用線程更新GUI組件的方法 */ private Handler handler = new Handler() { // handler接受消息,這裏來處理UI組件的更新 public void handleMessage(Message msg) { // UI組件處理應該在這裏,而不該該在任務TimerTask 的run裏面 switch (msg.what) { case 1: // 下面是進程條的更新 int currentProgress = bar.getProgress() + 1; if (currentProgress > bar.getMax()) currentProgress = 0; bar.setProgress(currentProgress); break; default: break; } }; };