Android之Handler:實現計時器例項
通常情況下,當應用程式啟動時,Android首先會開啟一個主執行緒 (也就是UI執行緒) , 主執行緒為管理介面中的UI控制元件,進行事件分發。如果此時需要一個耗時的操作,例如:聯網讀取資料,或者讀取本地較大的一個檔案的時候,你不能把這些操作放在主執行緒中,如果你放在主執行緒中的話,介面會出現假死現象,如果5秒鐘還沒有完成的話,會收到Android系統的一個錯誤提示”強制關閉”.
這個時候我們需要把這些耗時的操作,放在一個子執行緒中,因為子執行緒涉及到UI更新,但是當子執行緒中有涉及到操作UI的操作時,就會對主執行緒產生危險,也就是說,更新UI只能在主執行緒中更新,在子執行緒中操作是危險的.
這個時候,Handler就出現了來解決這個複雜的問題,由於Handler執行在主執行緒中(UI執行緒中),它與子執行緒可以通過Message物件來傳遞資料,這個時候,Handler就承擔著接受子執行緒傳過來的(子執行緒用sedMessage()方法傳遞)Message物件(裡面包含資料), 把這些訊息放入主執行緒佇列中,配合主執行緒進行更新UI。
所以,Handler的主要功能也就明確了,Handler主要接收子執行緒傳送的資料, 並用此資料配合主執行緒更新UI,用來跟UI主執行緒互動用。比如可以用handler傳送一個message,然後在handler的執行緒中來接收、處理該訊息,以避免直接在UI主執行緒中處理事務導致影響UI主執行緒的其他處理工作,Android提供了Handler作為主執行緒和子執行緒的紐帶;也可以將handler物件傳給其他程序,以便在其他程序中通過handler給你傳送事件;還可以通過handler的延時傳送message,可以延時處理一些事務的處理。
我通過一個計時器程式例項來使用Handler,以加深對Handler的理解。
一,Handler部分
private Handler uiHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) { //what的值為1而且paused為false時將Message送主執行緒
case 1:
if (!paused)
{
addTimeUsed(); //計時函式
updateClockUI(); //更新UI執行緒的資料
}
//uiHandler.sendEmptyMessageDelayed(1, 1000);
uiHandler.sendEmptyMessageDelayed(1, 1);//延時1毫秒後給what傳1
break;
default:
break;
}
}
};
二,更新時間的顯示
private void updateClockUI() {
minText.setText(getMin()+":");
secText.setText(getSec());
misText.setText(getMis());
}
三,計數程式
public void addTimeUsed() {
timeUsedInSec=timeUsedInSec+1;
timeUsed = this.getMin() + ":" + this.getSec();
}
public CharSequence getMin() {
return String.valueOf(timeUsedInSec / 6000);
}
public CharSequence getSec() {
int sec = (timeUsedInSec/100) % 60;
return sec < 10 ? "0" + sec : String.valueOf(sec);
}
public CharSequence getMis(){
int mis=timeUsedInSec;
mis=mis%100;
return mis < 10 ? "0" + mis : String.valueOf(mis);
}