Handler使用入门

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Handler使用入门相关的知识,希望对你有一定的参考价值。

Handler使用入门--北京尚学堂


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

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

1、新建一个项目Lesson27_Handler

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

1. packageandroid.basic.lesson27;

2.  

3. importandroid.app.Activity;

4. importandroid.app.ProgressDialog;

5. importandroid.content.res.Resources;

6. importandroid.os.Bundle;

7. importandroid.os.Handler;

8. importandroid.os.Message;

9. importandroid.util.Log;

10.importandroid.view.View;

11.importandroid.widget.Button;

12. 

13.public classMainHandler 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(Messagemsg){

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.                       publicvoid 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.}

复制代码

 

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

4、运行程序查看结果:

这个例子里,在辅助线程的run方法中执行长耗时操作,操作完毕后调用handler.sendEmptyMessage()方法,主线程中的HandlerhandleMessage()方法接受到这一消息,并做了就是关闭对话框的处理。

在接下来的例子里,让我们处理一些更复杂的操作来理解和练习Handler的使用方法。

 

更多Android相关内容请见:www.bjsxt.com

本文出自 “11158666” 博客,请务必保留此出处http://11168666.blog.51cto.com/11158666/1752602

以上是关于Handler使用入门的主要内容,如果未能解决你的问题,请参考以下文章

Netty入门——Handler & Pipeline

Handler机制从入门到放弃

Android基础入门教程——3.3 Handler消息传递机制浅析

ExtJS+Handler入门显示

Handler机制从入门到放弃

从使用Handler致内存泄漏角度源码追踪Handler工作机制