1. 程式人生 > >Android之Handler:實現計時器例項

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);
    }