Android当中Handler的使用

本文介绍如何在Android开发中使用Handler来处理长耗时操作,避免因操作耗时过长而导致应用无响应。通过实例演示了如何创建Handler对象,并在新线程中执行长耗时任务后通知主线程更新UI。
http://android.tgbus.com/Android/tutorial/201204/418916.shtml

在项目开发当中,当用户点击一个按钮时如果执行的是一个非常耗时的操作,处理不好很容易导致系统假死,用户体验很差,而Android开发当中则是,如果任意一个Acitivity没有响应5秒钟以上就会被强制关闭,因此我们需要另外起动一个线程来处理长耗时操作,而主线程则不受其影响,在耗时操作完结发送消息给主线程,主线程再做相应处理。那么线程之间的消息传递和异步处理用的就是Handler。

下面我们通过一个模拟文件下载的这个长耗时操作来做个说明:

  1、新建一个项目 Android_Handler

  2、在MainHandler.java中写如下面内容:

  package android.basic.android_handler;

  import android.app.Activity;

  import android.app.ProgressDialog;

  import android.content.res.Resources;

  import android.os.Bundle;

  import android.os.Handler;

  import android.os.Message;

  import android.util.Log;

  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();

  }

  };

  

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  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();

  }

  }

  }

  3、res/layout/main.xml的内容就省略了,可以根据程序运行截图和程序代码反推出来布局组件。

  4、运行程序查看结果

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值