Android中有关Handler的使用(一)

一个Handler允许你发送和处理消息(Message)以及与一个线程的消息队列相关的Runnable对象。每个Handler实例都和单个线程以及该线程的消息队列有关。当你创建了一个新Handler,它就会和创建它的线程/消息队列绑定,在那以后,它就会传递消息以及runnable对象给消息队列,然后执行它们。

需要使用Handler有两大主要的原因:

1)在将来的某个时间点调度处理消息和runnable对象;

2)将需要执行的操作放到其他线程之中,而不是自己的;

调度处理消息是通过调用post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long)sendMessageDelayed(Message, long)等方法完成的。其中的post版本的方法可以让你将Runnable对象放进消息队列;sendMessage版本的方法可以让你将一个包含有bundle对象的消息对象放进消息队列,然后交由handleMessage(Message)方法处理。(这个需要你复写HandlerhandleMessage方法)

【以上这段翻译自android sdk

Handler在实际开发中是很常用的,主要是用来接收子线程发送的数据,然后主线程结合此数据来更新界面UI

Android应用程序启动时,他会开启一个主线程(也就是UI线程),管理界面中的UI控件,进行事件派发,比如说:点击一个按钮,Android会分发事件到Button上从而来响应你的操作。但是当你需要执行一个比较耗时的操作的话,例如:进行IO操作,网络通信等等,若是执行时间超过5s,那么Android会弹出一个经典ANR无响应对话框,然后提示按“Force quit”或是“Wait”。解决此类问题的方法就是:我们把一些耗时的操作放到子线程中去执行。但因为子线程涉及到UI更新,而Android主线程是线程不安全的,所以更新UI的操作只能放在主线程中执行,若是放在子线程中执行的话很会出问题。所以这时就需要一种机制:主线程可以发送命令/任务给子线程执行,然后子线程反馈执行结果;

!你必需要知道的:

若在主线程中实例化一个Handler对象,例如:

HandlermHandler=newHandler();

此时它并没有新派生一个线程来执行此Handler,而是将此Handler附加在主线程上,故此时若你在Handler中执行耗时操作的话,还是会弹出ANR对话框!

下面就Handler的使用举一些例子,加深理解。

1post版本的Handler使用示例:

[java]view plaincopy
  1. packagecom.dxyh.test;
  2. importandroid.app.Activity;
  3. importandroid.content.Context;
  4. importandroid.os.Bundle;
  5. importandroid.os.Handler;
  6. importandroid.util.Log;
  7. importandroid.view.View;
  8. importandroid.view.View.OnClickListener;
  9. importandroid.widget.Button;
  10. publicclassMainActivityextendsActivity
  11. implementsOnClickListener{
  12. privatefinalstaticStringTAG="HandlerTest";
  13. privatefinalstaticintDELAY_TIME=1000;
  14. privateButtonbtnStart;
  15. privateButtonbtnStop;
  16. ContextmContext=null;
  17. /**Calledwhentheactivityisfirstcreated.*/
  18. @Override
  19. publicvoidonCreate(BundlesavedInstanceState){
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.main);
  22. mContext=this;
  23. Log.i(TAG,"Mainthreadid="+
  24. Thread.currentThread().getId());
  25. btnStart=(Button)findViewById(R.id.btn_start);
  26. btnStart.setOnClickListener(this);
  27. btnStop=(Button)findViewById(R.id.btn_stop);
  28. btnStop.setOnClickListener(this);
  29. }
  30. @Override
  31. publicvoidonClick(Viewview){
  32. switch(view.getId()){
  33. caseR.id.btn_start:
  34. mHandler.postDelayed(workRunnable,DELAY_TIME);
  35. break;
  36. caseR.id.btn_stop:
  37. mHandler.removeCallbacks(workRunnable);
  38. break;
  39. }
  40. }
  41. RunnableworkRunnable=newRunnable(){
  42. intcounter=0;
  43. publicvoidrun(){
  44. if(counter++<1){
  45. Log.i(TAG,"workRunnablethreadid="+
  46. Thread.currentThread().getId());
  47. mHandler.postDelayed(workRunnable,DELAY_TIME);
  48. }
  49. }
  50. };
  51. HandlermHandler=newHandler();
  52. }

Logcat显示如下:

说明:发现thread id是相同的,这就说明:默认情况下创建的Handler会绑定到主线程上,你不能做太耗时的操作。


Android中有关Handler的使用(二)

2、sendMessage版本的Handler的使用

这里介绍几种模型:

a、默认的Handler(消息处理队列挂在主线程上)

[java] view plain copy
  1. packagecom.dxyh.test;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.os.Handler;
  5. importandroid.os.Message;
  6. importandroid.util.Log;
  7. importandroid.view.View;
  8. importandroid.view.View.OnClickListener;
  9. importandroid.widget.Button;
  10. publicclassMainActivityextendsActivity
  11. implementsOnClickListener{
  12. privatefinalstaticStringTAG="HandlerTest";
  13. privatefinalstaticintTASK_BEGIN=1;
  14. privatefinalstaticintTASK_1=2;
  15. privatefinalstaticintTASK_2=3;
  16. privatefinalstaticintTASK_END=4;
  17. privateButtonbtnStart=null;
  18. privateButtonbtnStop=null;
  19. /**Calledwhentheactivityisfirstcreated.*/
  20. @Override
  21. publicvoidonCreate(BundlesavedInstanceState){
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.main);
  24. btnStart=(Button)findViewById(R.id.btn_start);
  25. btnStart.setOnClickListener(this);
  26. btnStop=(Button)findViewById(R.id.btn_stop);
  27. btnStop.setOnClickListener(this);
  28. Log.i(TAG,"[M_TID:"+Thread.currentThread().getId()+"]");
  29. }
  30. HandlermHandler=newHandler(){
  31. //注意:在各个case后面不能做太耗时的操作,否则出现ANR对话框
  32. @Override
  33. publicvoidhandleMessage(Messagemsg){
  34. switch(msg.what){
  35. caseTASK_BEGIN:
  36. Log.i(TAG,"[H_TID:"+
  37. Thread.currentThread().getId()+"]GetTASK_BEGIN");
  38. break;
  39. caseTASK_1:
  40. Log.i(TAG,"[H_TID:"+
  41. Thread.currentThread().getId()+"]GetTASK_1");
  42. break;
  43. caseTASK_2:
  44. Log.i(TAG,"[H_TID:"+
  45. Thread.currentThread().getId()+"]GetTASK_2");
  46. break;
  47. caseTASK_END:
  48. Log.i(TAG,"[H_TID:"+
  49. Thread.currentThread().getId()+"]GetTASK_END");
  50. finish();
  51. break;
  52. }
  53. super.handleMessage(msg);
  54. }
  55. };
  56. publicvoidonClick(Viewview){
  57. switch(view.getId()){
  58. caseR.id.btn_start:
  59. //启动任务(消息只有标识,立即投递)
  60. mHandler.sendEmptyMessage(TASK_BEGIN);
  61. Log.i(TAG,"SendTASK_BEGINtohandler.");
  62. //开始任务1(在mHandler的消息队列中获取一个Message对象,避免重复构造)
  63. Messagemsg1=mHandler.obtainMessage(TASK_1);
  64. msg1.obj="Thisistask1";
  65. mHandler.sendMessage(msg1);
  66. Log.i(TAG,"SendTASK_1tohandler.");
  67. //开启任务2(和上面类似)
  68. Messagemsg2=Message.obtain();
  69. msg2.arg1=10;
  70. msg2.arg2=20;
  71. msg2.what=TASK_2;
  72. mHandler.sendMessage(msg2);
  73. Log.i(TAG,"SendTASK_2tohandler.");
  74. break;
  75. caseR.id.btn_stop:
  76. //结束任务(空消息体,延时2s投递)
  77. mHandler.sendEmptyMessageDelayed(TASK_END,2000);
  78. Log.i(TAG,"SendTASK_ENDtohandler.");
  79. break;
  80. }
  81. }
  82. }

运行结果:

b、消息队列仍绑定在主线程上,但在子线程中发送消息。

[java] view plain copy
  1. packagecom.dxyh.test;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.os.Handler;
  5. importandroid.os.Message;
  6. importandroid.util.Log;
  7. publicclassMainActivityextendsActivity{
  8. privatefinalstaticStringTAG="HandlerTest";
  9. privatefinalstaticintTASK_BEGIN=1;
  10. privatefinalstaticintTASK_1=2;
  11. privatefinalstaticintTASK_2=3;
  12. privatefinalstaticintTASK_END=4;
  13. /**Calledwhentheactivityisfirstcreated.*/
  14. @Override
  15. publicvoidonCreate(BundlesavedInstanceState){
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.main);
  18. Log.i(TAG,"[M_TID:"+Thread.currentThread().getId()+"]"+
  19. "Thisisinmainthread.");
  20. workThread.start();
  21. }
  22. HandlermHandler=newHandler(){
  23. //注意:在各个case后面不能做太耗时的操作,否则出现ANR对话框
  24. @Override
  25. publicvoidhandleMessage(Messagemsg){
  26. switch(msg.what){
  27. caseTASK_BEGIN:
  28. Log.i(TAG,"[H_TID:"+
  29. Thread.currentThread().getId()+"]GetTASK_BEGIN");
  30. break;
  31. caseTASK_1:
  32. Log.i(TAG,"[H_TID:"+
  33. Thread.currentThread().getId()+"]GetTASK_1");
  34. break;
  35. caseTASK_2:
  36. Log.i(TAG,"[H_TID:"+
  37. Thread.currentThread().getId()+"]GetTASK_2");
  38. break;
  39. caseTASK_END:
  40. Log.i(TAG,"[H_TID:"+
  41. Thread.currentThread().getId()+"]GetTASK_END");
  42. finish();
  43. break;
  44. }
  45. super.handleMessage(msg);
  46. }
  47. };
  48. ThreadworkThread=newThread(){
  49. //你可以在run方法内做任何耗时的操作,然后将结果以消息形式投递到主线程的消息队列中
  50. @Override
  51. publicvoidrun(){
  52. //启动任务(消息只有标识,立即投递)
  53. mHandler.sendEmptyMessage(TASK_BEGIN);
  54. Log.i(TAG,"[S_TID:"+Thread.currentThread().getId()+"]"+
  55. "SendTASK_STARTtohandler.");
  56. //开始任务1(在mHandler的消息队列中获取一个Message对象,避免重复构造)
  57. Messagemsg1=mHandler.obtainMessage(TASK_1);
  58. msg1.obj="Thisistask1";
  59. mHandler.sendMessage(msg1);
  60. Log.i(TAG,"[S_TID:"+Thread.currentThread().getId()+"]"+
  61. "SendTASK_1tohandler.");
  62. //开启任务2(和上面类似)
  63. Messagemsg2=Message.obtain();
  64. msg2.arg1=10;
  65. msg2.arg2=20;
  66. msg2.what=TASK_2;
  67. mHandler.sendMessage(msg2);
  68. Log.i(TAG,"[S_TID:"+Thread.currentThread().getId()+"]"+
  69. "SendTASK_2tohandler.");
  70. //结束任务(空消息体,延时2s投递)
  71. mHandler.sendEmptyMessageDelayed(TASK_END,2000);
  72. Log.i(TAG,"[S_TID:"+Thread.currentThread().getId()+"]"+
  73. "SendTASK_ENDtohandler.");
  74. }
  75. };
  76. }

运行结果:

c、将消息队列绑定到子线程上,主线程只管通过Handler往子线程的消息队列中投递消息即可。

[java] view plain copy
  1. packagecom.dxyh.test;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.os.Handler;
  5. importandroid.os.HandlerThread;
  6. importandroid.os.Looper;
  7. importandroid.os.Message;
  8. importandroid.util.Log;
  9. publicclassMainActivityextendsActivity{
  10. privatefinalstaticStringTAG="HandlerTest";
  11. privatefinalstaticintTASK_BEGIN=1;
  12. privatefinalstaticintTASK_1=2;
  13. privatefinalstaticintTASK_2=3;
  14. privatefinalstaticintTASK_END=4;
  15. privateMyHandlermHandler=null;
  16. /**Calledwhentheactivityisfirstcreated.*/
  17. @Override
  18. publicvoidonCreate(BundlesavedInstanceState){
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.main);
  21. Log.i(TAG,"[M_TID:"+Thread.currentThread().getId()+"]"+
  22. "Thisisinmainthread.");
  23. HandlerThreadmyLooperThread=newHandlerThread("mylooperthread");
  24. myLooperThread.start();
  25. Looperlooper=myLooperThread.getLooper();
  26. mHandler=newMyHandler(looper);
  27. //启动任务(消息只有标识,立即投递)
  28. mHandler.sendEmptyMessage(TASK_BEGIN);
  29. Log.i(TAG,"[S_ID:"+Thread.currentThread().getId()+"]"+
  30. "SendTASK_STARTtohandler.");
  31. //开始任务1(在mHandler的消息队列中获取一个Message对象,避免重复构造)
  32. Messagemsg1=mHandler.obtainMessage(TASK_1);
  33. msg1.obj="Thisistask1";
  34. mHandler.sendMessage(msg1);
  35. Log.i(TAG,"[S_ID:"+Thread.currentThread().getId()+"]"+
  36. "SendTASK_1tohandler.");
  37. //开启任务2(和上面类似)
  38. Messagemsg2=Message.obtain();
  39. msg2.arg1=10;
  40. msg2.arg2=20;
  41. msg2.what=TASK_2;
  42. mHandler.sendMessage(msg2);
  43. Log.i(TAG,"[S_ID:"+Thread.currentThread().getId()+"]"+
  44. "SendTASK_2tohandler.");
  45. //结束任务(空消息体,延时2s投递)
  46. mHandler.sendEmptyMessageDelayed(TASK_END,2000);
  47. Log.i(TAG,"[S_ID:"+Thread.currentThread().getId()+"]"+
  48. "SendTASK_ENDtohandler.");
  49. }
  50. classMyHandlerextendsHandler{
  51. publicMyHandler(Looperlooper){
  52. super(looper);
  53. }
  54. //现在在每个case之后,你可以做任何耗时的操作了
  55. @Override
  56. publicvoidhandleMessage(Messagemsg){
  57. switch(msg.what){
  58. caseTASK_BEGIN:
  59. Log.i(TAG,"[H_TID:"+
  60. Thread.currentThread().getId()+"]GetTASK_BEGIN");
  61. break;
  62. caseTASK_1:
  63. Log.i(TAG,"[H_TID:"+
  64. Thread.currentThread().getId()+"]GetTASK_1");
  65. break;
  66. caseTASK_2:
  67. Log.i(TAG,"[H_TID:"+
  68. Thread.currentThread().getId()+"]GetTASK_2");
  69. break;
  70. caseTASK_END:
  71. Log.i(TAG,"[H_TID:"+
  72. Thread.currentThread().getId()+"]GetTASK_END");
  73. finish();
  74. break;
  75. }
  76. super.handleMessage(msg);
  77. }
  78. }
  79. }

运行结果:


Android中有关Handler的使用(三)

d、自己创建新的线程,然后在新线程中创建Looper,主线程调用子线程中的发消息方法,将消息发给子线程的消息队列。

[java] view plain copy
  1. packagecom.dxyh.test;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.os.Handler;
  5. importandroid.os.Looper;
  6. importandroid.os.Message;
  7. importandroid.util.Log;
  8. publicclassMainActivityextendsActivity{
  9. privatefinalstaticStringTAG="HandlerTest";
  10. privatefinalstaticintTASK_BEGIN=1;
  11. privatefinalstaticintTASK_1=2;
  12. privatefinalstaticintTASK_2=3;
  13. privatefinalstaticintTASK_END=4;
  14. privateHandlerworkHandler=null;
  15. /**Calledwhentheactivityisfirstcreated.*/
  16. @Override
  17. publicvoidonCreate(BundlesavedInstanceState){
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.main);
  20. Log.i(TAG,"[M_TID:"+Thread.currentThread().getId()+"]"+
  21. "Thisisinmainthread.");
  22. LooperThreadtestThread=newLooperThread();
  23. testThread.start();
  24. //注意,这里需要等待一下,防止出现空指针异常
  25. while(null==workHandler){
  26. }
  27. testThread.sendMessageTodoYourWork();
  28. }
  29. classLooperThreadextendsThread{
  30. @Override
  31. publicvoidrun(){
  32. Looper.prepare();
  33. workHandler=newHandler(){
  34. //现在在每个case之后,你可以做任何耗时的操作了
  35. @Override
  36. publicvoidhandleMessage(Messagemsg){
  37. switch(msg.what){
  38. caseTASK_BEGIN:
  39. Log.i(TAG,"[H_TID:"+
  40. Thread.currentThread().getId()+"]GetTASK_BEGIN");
  41. break;
  42. caseTASK_1:
  43. Log.i(TAG,"[H_TID:"+
  44. Thread.currentThread().getId()+"]GetTASK_1");
  45. break;
  46. caseTASK_2:
  47. Log.i(TAG,"[H_TID:"+
  48. Thread.currentThread().getId()+"]GetTASK_2");
  49. break;
  50. caseTASK_END:
  51. Log.i(TAG,"[H_TID:"+
  52. Thread.currentThread().getId()+"]GetTASK_END");
  53. Looper.myLooper().quit();
  54. finish();
  55. break;
  56. }
  57. super.handleMessage(msg);
  58. }
  59. };
  60. Looper.loop();
  61. }
  62. publicvoidsendMessageTodoYourWork(){
  63. Log.i(TAG,"[S_ID:"+Thread.currentThread().getId()+"]"+
  64. "SendTASK_STARTtohandler.");
  65. //启动任务(消息只有标识,立即投递)
  66. workHandler.sendEmptyMessage(TASK_BEGIN);
  67. Log.i(TAG,"[S_ID:"+Thread.currentThread().getId()+"]"+
  68. "SendTASK_1tohandler.");
  69. //开始任务1(在workHandler的消息队列中获取一个Message对象,避免重复构造)
  70. Messagemsg1=workHandler.obtainMessage(TASK_1);
  71. msg1.obj="Thisistask1";
  72. workHandler.sendMessage(msg1);
  73. Log.i(TAG,"[S_ID:"+Thread.currentThread().getId()+"]"+
  74. "SendTASK_2tohandler.");
  75. //开启任务2(和上面类似)
  76. Messagemsg2=Message.obtain();
  77. msg2.arg1=10;
  78. msg2.arg2=20;
  79. msg2.what=TASK_2;
  80. workHandler.sendMessage(msg2);
  81. Log.i(TAG,"[S_ID:"+Thread.currentThread().getId()+"]"+
  82. "SendTASK_ENDtohandler.");
  83. //结束任务(空消息体,延时2s投递)
  84. workHandler.sendEmptyMessageDelayed(TASK_END,2000);
  85. }
  86. }
  87. }

运行结果:

e、主/子线程均有一个消息队列,然后相互传递消息(这种方式是最灵活的,双向传递,也不复杂)

[java] view plain copy
  1. packagecom.dxyh.test;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.os.Handler;
  5. importandroid.os.Looper;
  6. importandroid.os.Message;
  7. importandroid.util.Log;
  8. publicclassMainActivityextendsActivity{
  9. privatefinalstaticStringTAG="HandlerTest";
  10. privatefinalstaticintTASK_BEGIN=1;
  11. privatefinalstaticintTASK_1=2;
  12. privatefinalstaticintTASK_2=3;
  13. privatefinalstaticintTASK_END=4;
  14. privatefinalstaticintTASK_BEGIN_OVER=11;
  15. privatefinalstaticintTASK_1_OVER=12;
  16. privatefinalstaticintTASK_2_OVER=13;
  17. privatefinalstaticintTASK_END_OVER=14;
  18. privateHandlerworkHandler=null;
  19. /**Calledwhentheactivityisfirstcreated.*/
  20. @Override
  21. publicvoidonCreate(BundlesavedInstanceState){
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.main);
  24. Log.i(TAG,"[M_TID:"+Thread.currentThread().getId()+"]"+
  25. "Thisisinmainthread.");
  26. LooperThreadtestThread=newLooperThread();
  27. testThread.start();
  28. //注意,这里需要等待一下,防止出现空指针异常
  29. while(null==workHandler){
  30. }
  31. testThread.sendMessageTodoYourWork();
  32. }
  33. HandlermainHandler=newHandler(){
  34. //在每个case之后,不能做耗时的操作
  35. @Override
  36. publicvoidhandleMessage(Messagemsg){
  37. switch(msg.what){
  38. caseTASK_BEGIN_OVER:
  39. Log.i(TAG,"[MH_TID:"+
  40. Thread.currentThread().getId()+"]TASK_BEGIN_OVER");
  41. break;
  42. caseTASK_1_OVER:
  43. Log.i(TAG,"[MH_TID:"+
  44. Thread.currentThread().getId()+"]TASK_1_OVER");
  45. break;
  46. caseTASK_2_OVER:
  47. Log.i(TAG,"[MH_TID:"+
  48. Thread.currentThread().getId()+"]TASK_2_OVER");
  49. break;
  50. caseTASK_END_OVER:
  51. Log.i(TAG,"[MH_TID:"+
  52. Thread.currentThread().getId()+"]TASK_END_OVER");
  53. finish();
  54. break;
  55. }
  56. super.handleMessage(msg);
  57. }
  58. };
  59. classLooperThreadextendsThread{
  60. @Override
  61. publicvoidrun(){
  62. Looper.prepare();
  63. workHandler=newHandler(){
  64. //现在在每个case之后,你可以做任何耗时的操作了
  65. @Override
  66. publicvoidhandleMessage(Messagemsg){
  67. switch(msg.what){
  68. caseTASK_BEGIN:
  69. Log.i(TAG,"[ZH_TID:"+
  70. Thread.currentThread().getId()+"]GetTASK_BEGIN");
  71. //做完之后报告信息给主线程
  72. mainHandler.sendEmptyMessage(TASK_BEGIN_OVER);
  73. break;
  74. caseTASK_1:
  75. Log.i(TAG,"[ZH_TID:"+
  76. Thread.currentThread().getId()+"]GetTASK_1");
  77. //做完之后报告信息给主线程
  78. mainHandler.sendEmptyMessage(TASK_1_OVER);
  79. break;
  80. caseTASK_2:
  81. Log.i(TAG,"[ZH_TID:"+
  82. Thread.currentThread().getId()+"]GetTASK_2");
  83. //做完之后报告信息给主线程
  84. mainHandler.sendEmptyMessage(TASK_2_OVER);
  85. break;
  86. caseTASK_END:
  87. Log.i(TAG,"[ZH_TID:"+
  88. Thread.currentThread().getId()+"]GetTASK_END");
  89. Looper.myLooper().quit();
  90. //做完之后报告信息给主线程
  91. mainHandler.sendEmptyMessage(TASK_END_OVER);
  92. Looper.myLooper().quit();
  93. break;
  94. }
  95. super.handleMessage(msg);
  96. }
  97. };
  98. Looper.loop();
  99. }
  100. publicvoidsendMessageTodoYourWork(){
  101. Log.i(TAG,"[ZS_ID:"+Thread.currentThread().getId()+"]"+
  102. "SendTASK_STARTtohandler.");
  103. //启动任务(消息只有标识,立即投递)
  104. workHandler.sendEmptyMessage(TASK_BEGIN);
  105. Log.i(TAG,"[ZS_ID:"+Thread.currentThread().getId()+"]"+
  106. "SendTASK_1tohandler.");
  107. //开始任务1(在workHandler的消息队列中获取一个Message对象,避免重复构造)
  108. Messagemsg1=workHandler.obtainMessage(TASK_1);
  109. msg1.obj="Thisistask1";
  110. workHandler.sendMessage(msg1);
  111. Log.i(TAG,"[ZS_ID:"+Thread.currentThread().getId()+"]"+
  112. "SendTASK_2tohandler.");
  113. //开启任务2(和上面类似)
  114. Messagemsg2=Message.obtain();
  115. msg2.arg1=10;
  116. msg2.arg2=20;
  117. msg2.what=TASK_2;
  118. workHandler.sendMessage(msg2);
  119. Log.i(TAG,"[ZS_ID:"+Thread.currentThread().getId()+"]"+
  120. "SendTASK_ENDtohandler.");
  121. //结束任务(空消息体,延时2s投递)
  122. workHandler.sendEmptyMessageDelayed(TASK_END,2000);
  123. }
  124. }
  125. }

运行结果:

小结:HandlerAndroid中是很常用的,或是用来更新UI,或是派发任务给子线程去执行,也可以用来产生超时效果,比如用sendMessageDelayed(TASK_TIMEOUT, OUT_TIME)方法。


更多相关文章

  1. 开机自动运行程序【Android】
  2. Android异步任务和消息机制
  3. Android开发规范-A
  4. Android(安卓)Handler的机制和原理(二)
  5. Android(安卓)View和GLSurfaceView使用OpenGL绘制对比
  6. android异步操作类AsyncTask的使用详解
  7. Android异步任务处理框架AsyncTask源码分析
  8. Android百度推送使用详解
  9. 关于广播接受者的问题

随机推荐

  1. Android之UI学习篇八:使用GridView实现九
  2. Android监听呼出电话
  3. Android(安卓)实用工具Hierarchy Viewer
  4. [记录点滴]在Ionic和Android中上传Blob图
  5. Android伸手党系列之四:Android项目开发常
  6. Android读写XML(下)——创建XML文档
  7. Android(安卓)中关于Cursor类的介绍
  8. android机制系列之七 Android(安卓)Camer
  9. Android(安卓)的invalidate 与postInvali
  10. Flutter 混合开发(Android)Flutter跟Native