1. 程式人生 > >Handler訊息傳遞機制(一)簡介

Handler訊息傳遞機制(一)簡介

宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!!

文章目錄

前言簡介

實戰案例

1、在新啟動的子執行緒傳送訊息

2、在主執行緒中獲取、處理訊息

3、我的demo 和 演示效果


前言簡介

Android的訊息傳遞機制主要是為了解決Android應用的多執行緒問題,Android平臺不允許Activity新啟動的子執行緒訪問該Activity裡面的介面元件,這樣會導致新啟動的執行緒無法動態改變介面元件的屬性值。如:Android實際開發當中,尤其涉及遊戲開發經常需要新啟動的執行緒,週期性的去訪問改變介面元件的屬性值。那麼怎麼解決呢?我們可以用Handler、AsyncTask相關機制來解決,這篇我們主要講Handler,有關AsyncTask介紹可參考:

Android專題之AsyncTask(一)基本概念介紹

1、Handler的實現方式?

 (1)在新啟動的執行緒中傳送訊息     (2)在主執行緒中獲取、處理訊息

2、那麼新啟動的子執行緒何時傳送訊息呢?主執行緒何時去處獲取並處理訊息呢?

為了讓主執行緒能更好的處理新啟動的執行緒所傳送的訊息,顯然只能通過回撥的方式來實現,開發者只需要重寫Handler類中處理訊息的方法,當新啟動的子執行緒傳送訊息時,Handler類中處理訊息的方法被自動回撥。Handler類中包含如下方法傳送、處理訊息

實戰案例

這裡我就把以前專案 “app下載更新自動安裝” 的程式碼給改了改,因為主要是演示Handler的用法,所以其它步驟就用模擬或輸出的形式呈現!

1、在新啟動的子執行緒傳送訊息

模擬下載app,並在新啟動的子執行緒傳送訊息

public class DownLoadAppFile {
    public void download(String urlPath, Handler handler, ProgressBar pb) {

        try {
            //下載apk的程式碼,這裡用執行緒睡眠模擬
            Thread.currentThread().sleep(3*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        Message msg = Message.obtain();
        msg.what =1;//成功
        //msg.what =2;//失敗
        handler.sendMessage(msg);//傳送訊息

    }
}

2、在主執行緒中獲取、處理訊息

public class MainActivity extends AppCompatActivity {
    private  TextView show_text;
    private String strMsg;

    //在主執行緒中獲取、處理訊息
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1://下載成功
                    strMsg = strMsg +"\n"+ "2、apk下載成功。。。開始自動安裝下載好的apk!";
                    show_text.setText(strMsg);
                    Toast.makeText(MainActivity.this,"apk下載成功!",Toast.LENGTH_SHORT).show();
                    break;
                case 2://下載失敗
                    strMsg = strMsg +"\n"+ "apk下載失敗!";
                    show_text.setText(strMsg);
                    Toast.makeText(MainActivity.this,"apk下載失敗!",Toast.LENGTH_SHORT).show();
                    break;

                default:
                    break;
            }
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        show_text = (TextView) findViewById(R.id.show_text);

        downloadApkFile();

    }


    /**
     *  下載apk檔案
     *  注:Android 6.0以上需要申請讀寫許可權
     */
    private void downloadApkFile() {

        strMsg = "1、開始下載apk。。。";
        show_text.setText(strMsg);
        Toast.makeText(MainActivity.this,"開始下載apk。。。",Toast.LENGTH_SHORT).show();

        new Thread() {//在新啟動的子執行緒,呼叫下載app的程式碼,併發送訊息、反饋結果
            public void run() {

                DownLoadAppFile downLoadFile = new DownLoadAppFile();
                downLoadFile.download(null, handler, null);
            };
        }.start();
    }
}

3、我的demo 和 演示效果

我的demo地址:https://download.csdn.net/download/yudbl/10894028

效果如下: