Handler訊息傳遞機制(一)簡介
阿新 • • 發佈:2019-01-05
宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!!
文章目錄
前言簡介
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
效果如下: