当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而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()方法接受到这一消息,并做了就是关闭对话框的处理。

本文发布:Android开发网
本文地址:http://www.jizhuomi.com/android/course/192.html
2012年9月7日
发布:鸡啄米 分类:Android开发教程 浏览: 评论:2