【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()方法接受到这一消息,并做了就是关闭对话框的处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值