android之路之Handler的使用
Handler的作用一般是子線程向主線程中傳遞訊息,用來主線程處理和UI相關的東西。為什麼要在子線程中用呢,因為如果主線程處理了過多耗時的東西,可能會導致假死,所以一般都放到子線程中去處理耗時的東西。
先看下上面的介面。就是這樣子,類比一個耗時操作,然後下載完成後關閉對話方塊。
看下主Activity:
package com.howlaa.lesson27_handler;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.app.ProgressDialog;import android.content.res.Resources;import android.util.Log;import android.view.Menu;import android.view.View;import android.widget.Button;public class MainHandler extends Activity { //聲明變數 private Button b1; private ProgressDialog pd; //定義Handler對象 private Handler handler =new Handler(){ @Override //當有訊息發送出來的時候就執行Handler的這個方法 public void handleMessage(Message msg){ super.handleMessage(msg); //只要執行到這裡就關閉對話方塊 pd.dismiss(); } };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main_handler);Resources res= this.getResources(); //查看UI組件所在的線程名 Log.i("tag", "onCreate()-->"+Thread.currentThread().getName()); //定義UI組件 b1= (Button)findViewById(R.id.Button01); //給按鈕綁定單擊事件監聽器 b1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //點擊按鈕後去處理長耗時操作 processThread(); } });}private void processThread(){ //構建一個下載進度條 pd= ProgressDialog.show(MainHandler.this, "下載檔案", "正在下載……"); Log.i("tag", "processThread()-->"+Thread.currentThread().getName()); new Thread(){ @Override public void run(){ Log.i("tag", "run()-->"+Thread.currentThread().getName()); //在新線程裡執行長耗時方法 longTimeMethod(); //執行完畢後給handler發送一個空訊息 handler.sendEmptyMessage(0); } }.start();} //類比下載檔案的長耗時方法 private void longTimeMethod(){ try { Log.i("tag", "longTimeMethod-->"+Thread.currentThread().getName()); Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } }}layout介面就不需要貼啦。