【Android】Handler使用入門

本講內容:Handler使用入門

當用戶點擊一個按鈕時如果執行的是一個常耗時操作的話,處理不好會導致系統假死,用戶體驗很差,而Android則更進一步,如果任意一個Acitivity沒有響應5秒鐘以上就會被強制關閉,因此我們需要另外起動一個線程來處理長耗時操作,而主線程則不受其影響,在耗時操作完結髮送消息給主線程,主線程再做相應處理。那麼線程之間的消息傳遞和異步處理用的就是Handler。

下面我們通過一個模擬文件下載的這個長耗時操作來做個說明:

1、新建一個項目 Lesson27_Handler

2、在MainHandler.java中寫如下面內容:

 

 

  1. package android.basic.lesson27;  
  2. import android.app.Activity;  
  3. import android.app.ProgressDialog;  
  4. import android.content.res.Resources;  
  5. import android.os.Bundle;  
  6. import android.os.Handler;  
  7. import android.os.Message;  
  8. import android.util.Log;  
  9. import android.view.View;  
  10. import android.widget.Button;  
  11. public class MainHandler extends Activity {  
  12.     //聲明變量   
  13.     private Button b1;  
  14.     private ProgressDialog pd;  
  15.     //定義Handler對象   
  16.     private Handler handler =new Handler(){  
  17.         @Override  
  18.         //當有消息發送出來的時候就執行Handler的這個方法   
  19.         public void handleMessage(Message msg){  
  20.             super.handleMessage(msg);  
  21.             //只要執行到這裏就關閉對話框   
  22.             pd.dismiss();  
  23.         }  
  24.     };  
  25.     /** Called when the activity is first created. */  
  26.     @Override  
  27.     public void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         setContentView(R.layout.main);  
  30.         Resources res=  this.getResources();  
  31.         //查看UI組件所在的線程名   
  32.         Log.i("tag""onCreate()-->"+Thread.currentThread().getName());  
  33.         //定義UI組件   
  34.         b1= (Button)findViewById(R.id.Button01);  
  35.         //給按鈕綁定單擊事件監聽器   
  36.         b1.setOnClickListener(new View.OnClickListener() {  
  37.             @Override  
  38.             public void onClick(View v) {  
  39.                 //點擊按鈕後去處理長耗時操作   
  40.                 processThread();  
  41.             }  
  42.         });  
  43.     }  
  44.     private void processThread(){  
  45.         //構建一個下載進度條   
  46.         pd= ProgressDialog.show(MainHandler.this"下載文件""正在下載……");  
  47.         Log.i("tag""processThread()-->"+Thread.currentThread().getName());  
  48.         new Thread(){  
  49.             @Override  
  50.             public void run(){  
  51.                 Log.i("tag""run()-->"+Thread.currentThread().getName());  
  52.                 //在新線程裏執行長耗時方法   
  53.                 longTimeMethod();  
  54.                 //執行完畢後給handler發送一個空消息   
  55.                 handler.sendEmptyMessage(0);  
  56.             }  
  57.         }.start();  
  58.     }  
  59.     //模擬下載文件的長耗時方法   
  60.     private void longTimeMethod(){  
  61.         try {  
  62.             Log.i("tag""longTimeMethod-->"+Thread.currentThread().getName());  
  63.             Thread.sleep(10000);  
  64.         } catch (InterruptedException e) {  
  65.             e.printStackTrace();  
  66.         }  
  67.     }  
  68. }  

 

3、res/layout/main.xml的內容就省略了,你們可以根據程序運行截圖和程序代碼反推出來佈局組件。

4、運行程序查看結果:

 

 

 

這個例子裏,在輔助線程的run方法中執行長耗時操作,操作完畢後調用handler.sendEmptyMessage()方法,主線程中的Handler的 handleMessage()方法接受到這一消息,並做了就是關閉對話框的處理。

發佈了13 篇原創文章 · 獲贊 11 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章