Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android學習指南之二十七:如何使用Handler

Android學習指南之二十七:如何使用Handler

編輯:關於android開發

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

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

       1、新建一個項目Lesson27_Handler。

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

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

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

       4、運行程序查看結果:

Android Handler的使用

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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved