我们进行Android开发时,Handler可以说是使用非常频繁的一个概念,它的用处不言而喻。本文就详细介绍Handler的基本概念和用法。

Handler的基本概念

Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出,然后对消息进行出来,就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。

Handler工具类在多线程中有两方面的应用:

  1、发送消息,在不同的线程间发送消息,使用的方法为sendXXX();。

  android.os.Handler对象通过下面的方法发送消息的:
  sendEmptyMessage(int),发送一个空的消息;
  sendMessage(Message),发送消息,消息中可以携带参数;
  sendMessageAtTime(Message, long),未来某一时间点发送消息;
  sendMessageDelayed(Message, long),延时Nms发送消息。

2、计划任务,在未来执行某任务,使用的方法为postXXX();。

  android.os.Handler对象通过下面的方法执行计划任务:
  post(Runnable),提交计划任务马上执行;
  postAtTime(Runnable, long),提交计划任务在未来的时间点执行;
  postDelayed(Runnable, long),提交计划任务延时Nms执行。

使用一个例子简单的来介绍一下Handler。

示例1:一个应用程序中有2个按钮(start、end),当点击start按钮时,执行一个线程,这个线程在控制台输出一串字符串,并且每隔3秒再执行一次线程,直到点击end按钮为止,线程停止。

下图为这个应用程序的界面:

下图为执行程序时控制台的输出:

开发步骤:

1、新建一个Android应用程序

2、在布局文件中添加2个Button控件标签,并为其设置属性和值

3、在Activity中,声明控件变量并根据id获得控件对象

4、在Activity中,创建一个Handler对象

5、在Activity中,创建一个Runnable对象

a) 以匿名内部类的方式

b) 将要执行的操作写在Runnable对象中的run()方法中

i. 打印出一句话

ii. 调用Runnable对象的postDelayed()方法

6、在Activity中,编写start按钮需要的监听器,并绑定。

在这个监听器的Onclick()方法中,调用Handler的post()方法,将要执行的线程对象放到队列当中。

7、在Activity中,编写end按钮需要的监听器,并帮定。

在这个监听器的Onclick()方法中,调用Handler的removeCallbacks ()方法,删除队列当中未执行的线程对象。

下面是Activity的代码:

Java代码
  1. packageandroid.handler;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.os.Handler;
  5. importandroid.view.View;
  6. importandroid.view.View.OnClickListener;
  7. importandroid.widget.Button;
  8. publicclassHandlerTestextendsActivity{
  9. /**Calledwhentheactivityisfirstcreated.*/
  10. privateButtonstartButton;
  11. privateButtonendButton;
  12. @Override
  13. publicvoidonCreate(BundlesavedInstanceState){
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.main);
  16. //根据id获得控件对象
  17. startButton=(Button)findViewById(R.id.startButton);
  18. endButton=(Button)findViewById(R.id.endButton);
  19. //为控件设置监听器
  20. startButton.setOnClickListener(newStartButtonListener());
  21. endButton.setOnClickListener(newEndButtonListener());
  22. }
  23. classStartButtonListenerimplementsOnClickListener{
  24. publicvoidonClick(Viewv){
  25. //调用Handler的post()方法,将要执行的线程对象放到队列当中
  26. handler.post(updateThread);
  27. }
  28. }
  29. classEndButtonListenerimplementsOnClickListener{
  30. publicvoidonClick(Viewv){
  31. //调用Handler的removeCallbacks()方法,删除队列当中未执行的线程对象
  32. handler.removeCallbacks(updateThread);
  33. }
  34. }
  35. //创建Handler对象
  36. Handlerhandler=newHandler();
  37. //新建一个线程对象
  38. RunnableupdateThread=newRunnable(){
  39. //将要执行的操作写在线程对象的run方法当中
  40. publicvoidrun(){
  41. System.out.println("updateThread");
  42. //调用Handler的postDelayed()方法
  43. //这个方法的作用是:将要执行的线程对象放入到队列当中,待时间结束后,运行制定的线程对象
  44. //第一个参数是Runnable类型:将要执行的线程对象
  45. //第二个参数是long类型:延迟的时间,以毫秒为单位
  46. handler.postDelayed(updateThread,3000);
  47. }
  48. };
  49. }

示例2:一个应用程序中有一个进度条和一个按钮,当点击按钮后,每隔一秒钟进度条前进一部分。

开发步骤:

1、新建一个Android应用程序

2、在布局文件中添加一个progressBar和一个Button,并为其设置属性和值

3、在Activity中,声明控件变量并根据id获得控件对象

4、创建线程对象

a)通过匿名内部类的方式

b)在编写完了5、6步之后再来继续编写这个线程对象里的操作

i. 声明一个变量用来设置进度条的进度

ii. 重写线程类的run方法(),里面编写要执行的操作

1)打印一个字符串

2)进度条的值增加

3)得到一个消息对象

4)设置消息对象arg1的值

5)让线程休眠一秒钟

6)将消息对象放入到消息队列中

7)判断,如果进度条的值等于100,则将线程对象从队列中移除。

5、 创建Handler对象

a) 与示例1不同的地方是,这里是通过匿名内部类的方式来声明的,而示例1是直接new出来的对象。

b) 重写Handler对象的handlerMessage(Message msg)方法。

i. 这个方法传入了一个Message对象,即消息对象,首先设置进度条的进度(这个值是Messag对象里面的一个成员变量arg1)。

ii. 将要执行的线程对象放入到队列当中。

6、 编写Button需要的监听器,并绑定

a) 设置进度条为显示状态。

b) 将要执行的线程对象放入到队列当中。

下面是Activity的代码:

Java代码
  1. packageandroid.handler;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.os.Handler;
  5. importandroid.os.Message;
  6. importandroid.view.View;
  7. importandroid.view.View.OnClickListener;
  8. importandroid.widget.Button;
  9. importandroid.widget.ProgressBar;
  10. publicclassProgressBarHandlerTestextendsActivity{
  11. /**Calledwhentheactivityisfirstcreated.*/
  12. privateProgressBarprogressBar;
  13. privateButtonstartButton;
  14. @Override
  15. publicvoidonCreate(BundlesavedInstanceState){
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.main);
  18. progressBar=(ProgressBar)findViewById(R.id.progressbar);
  19. startButton=(Button)findViewById(R.id.startButton);
  20. startButton.setOnClickListener(newProgressBarOnClickListener());
  21. }
  22. classProgressBarOnClickListenerimplementsOnClickListener{
  23. publicvoidonClick(Viewv){
  24. //设置进度条为可见状态
  25. progressBar.setVisibility(View.VISIBLE);
  26. updateBarHandler.post(updateThread);
  27. }
  28. }
  29. //使用匿名内部类来复写Handler当中的handlerMessage()方法
  30. HandlerupdateBarHandler=newHandler(){
  31. @Override
  32. publicvoidhandleMessage(Messagemsg){
  33. progressBar.setProgress(msg.arg1);
  34. updateBarHandler.post(updateThread);//将要执行的线程放入到队列当中
  35. }
  36. };
  37. //线程类,该类使用匿名内部类的方式进行声明
  38. RunnableupdateThread=newRunnable(){
  39. inti=0;
  40. publicvoidrun(){
  41. //TODOAuto-generatedmethodstub
  42. System.out.println("BeginThread");
  43. i+=10;
  44. //得到一个消息对象,Message类是android系统提供的
  45. Messagemsg=updateBarHandler.obtainMessage();
  46. //将Message对象的arg1参数的值设置为i
  47. msg.arg1=i;//用arg1、arg2这两个成员变量传递消息,优点是系统性能消耗较少
  48. try{
  49. Thread.sleep(1000);//让当前线程休眠1000毫秒
  50. }catch(InterruptedExceptionex){
  51. ex.printStackTrace();
  52. }
  53. //将Message对象加入到消息队列当中
  54. updateBarHandler.sendMessage(msg);
  55. //如果i的值等于100
  56. if(i==100){
  57. //将线程对象从队列中移除
  58. updateBarHandler.removeCallbacks(updateThread);
  59. }
  60. }
  61. };
  62. }

更多相关文章

  1. UI与线程交互
  2. android线程模型文章集合
  3. 往Android的Application对象里存储数据的陷阱
  4. android 异步加载
  5. Android系列学习:JSON解析
  6. Android实现掷骰子效果
  7. 【Browser】浏览器横屏时程序崩溃
  8. Android(安卓)Studio——点击事件监听
  9. Mms模块ConversationList流程分析(1)

随机推荐

  1. Android Windows 显示层次
  2. 定制Android版本的chromium之笔记
  3. android 笔记 --- Android自动判断输入是
  4. 【Android】Android Studio使用gradle导
  5. Android大赛首轮获奖作品解析。。。
  6. Android中文API(119)——TableRow
  7. Android 开发笔记——全局变量
  8. Android开发(十一)——ImageView的尺寸设置
  9. Android关于ListView中的getItemViewType
  10. Android学习以及如何用android赚钱