一.Handler的定义:

主要接受子线程发送的数据, 并用此数据配合主线程更新UI。
解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button, Android会分发事件到Button上,来响应你的操作。如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示"强制关闭".这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的. 这个时候,Handler就出现了来解决这个复杂的问题,由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据), 把这些消息放入主线程队列中,配合主线程进行更新UI。


二.使用过程:

1定义Handler对象并初始化,重写handleMessage()函数

2定义Thread线程对象,通常写成一个类形式(如class ThreadTest implements Runnable),在run()方法中操作数据,并把数据handler.sendMessage()方法传输 到handler对象中,并开启线程。(注意:该步骤不一定用Thread实现,也可以利用TimeTask实现,具体的操作同样放在run()方法中)

3在handleMessage()函数中根据不同的数据形式实现不同的方法。


三.Handler中分发消息的一些方法

post(Runnable)

postAtTime(Runnable,long)

postDelayed(Runnable long)

sendEmptyMessage(int)

sendMessage(Message)

sendMessageAtTime(Message,long)

sendMessageDelayed(Message,long)


实例:

[java] view plain
  1. importandroid.app.Activity;
  2. importandroid.os.Bundle;
  3. importandroid.os.Handler;
  4. importandroid.os.Message;
  5. importandroid.util.Log;
  6. importandroid.view.View;
  7. importandroid.view.View.OnClickListener;
  8. importandroid.widget.Button;
  9. importandroid.widget.TextView;
  10. publicclassMainAcitivityextendsActivity{
  11. /**Calledwhentheactivityisfirstcreated.*/
  12. privateHandlerhandler=newHandler(){
  13. publicvoidhandleMessage(Messagemsg){
  14. switch(msg.arg1){
  15. case1:
  16. txtTextView.setText("bbbb");
  17. break;
  18. case2:
  19. setTitle("aaa");
  20. default:
  21. break;
  22. }
  23. }
  24. };
  25. privateButtonbtn;
  26. privateTextViewtxtTextView;
  27. @Override
  28. publicvoidonCreate(BundlesavedInstanceState){
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.main);
  31. txtTextView=(TextView)findViewById(R.id.txtView);
  32. btn=(Button)findViewById(R.id.btn);
  33. btn.setOnClickListener(newOnClickListener(){
  34. publicvoidonClick(Viewarg0){
  35. ThreadTestthreadTest=newThreadTest();
  36. newThread(threadTest).start();
  37. ThreadTest2threadTest2=newThreadTest2();
  38. newThread(threadTest2).start();
  39. }
  40. });
  41. }
  42. privateclassThreadTestimplementsRunnable{
  43. publicvoidrun(){
  44. //TODOAuto-generatedmethodstub
  45. try{
  46. Thread.sleep(1000);
  47. }
  48. catch(Exceptione){
  49. e.printStackTrace();
  50. }
  51. MessagemsgMessage=newMessage();
  52. msgMessage.arg1=1;
  53. handler.sendMessage(msgMessage);
  54. Log.e("ThreadName",Thread.currentThread().getName());
  55. }
  56. }
  57. privateclassThreadTest2implementsRunnable{
  58. publicvoidrun(){
  59. //TODOAuto-generatedmethodstub
  60. try{
  61. Thread.sleep(1000);
  62. }
  63. catch(Exceptione){
  64. e.printStackTrace();
  65. }
  66. MessagemsgMessage=newMessage();
  67. msgMessage.arg1=2;
  68. handler.sendMessage(msgMessage);
  69. Log.e("ThreadName",Thread.currentThread().getName());
  70. }
  71. }
  72. }

更多相关文章

  1. android线程间通信之handler
  2. Android中子线程真的不能更新UI吗?
  3. android 线程间的通信
  4. 【多端应用开发系列1.1.1 —— Android:使用新浪API V2】服务器Js
  5. Android之线程阻塞(一)
  6. 【Android 开发】: Android客户端与服务端之间使用JSON交互数据

随机推荐

  1. Android(安卓)keytool 生成证书MD5指纹
  2. Android(安卓)应用指定浏览器开发实例
  3. TableLayout
  4. android 用UDP做的心跳连接 小示例
  5. android 圆环图形的实现
  6. Android中蓝牙使用步骤小结
  7. android获取手机中的短信和,android获取
  8. Android(安卓)中文API (66) —— Bluetooth
  9. android单元测试Test run failed: Unable
  10. Android(安卓)自定义标题栏(title栏)