上一节中,是主线程自己发了一个消息到自己的Message Queue中,并把消息从队列中提取出来。那么如何由别的线程发送消息给主线程的Message Queue中呢?

直接看代码~~?[Copy to clipboard]Download zuiniuwang.java

        
  1. <spanstyle="font-size:14px">/**
  2. *MessageQueue2.java
  3. *com.test
  4. *
  5. *Function:TODO
  6. *
  7. *verdateauthor
  8. *──────────────────────────────────
  9. *2011-3-20Leon
  10. *
  11. *Copyright(c)2011,TNTAllRightsReserved.
  12. */
  13. packagecom.test;
  14. /**
  15. *ClassName:MessageQueue2
  16. *Function:TODOADDFUNCTION
  17. *Reason:TODOADDREASON
  18. *
  19. *@authorLeon
  20. *@version
  21. *@sinceVer1.1
  22. *@Date2011-3-20
  23. */
  24. importandroid.app.Activity;
  25. importandroid.graphics.Color;
  26. importandroid.os.Bundle;
  27. importandroid.os.Handler;
  28. importandroid.os.Looper;
  29. importandroid.os.Message;
  30. importandroid.view.View;
  31. importandroid.view.View.OnClickListener;
  32. importandroid.widget.Button;
  33. importandroid.widget.LinearLayout;
  34. importandroid.widget.TextView;
  35. publicclassMessageQueue2extendsActivityimplementsOnClickListener{
  36. privatefinalintWC=LinearLayout.LayoutParams.WRAP_CONTENT;
  37. privatefinalintFP=LinearLayout.LayoutParams.FILL_PARENT;
  38. publicTextViewtv;
  39. privatemyThreadt;
  40. privateButtonbtn,btn2,btn3;
  41. publicvoidonCreate(Bundleicicle){
  42. super.onCreate(icicle);
  43. LinearLayoutlayout=newLinearLayout(this);
  44. layout.setOrientation(LinearLayout.VERTICAL);
  45. btn=newButton(this);
  46. btn.setId(101);
  47. btn.setText("testlooper");
  48. btn.setOnClickListener(this);
  49. LinearLayout.LayoutParamsparam=
  50. newLinearLayout.LayoutParams(100,50);
  51. param.topMargin=10;
  52. layout.addView(btn,param);
  53. btn2=newButton(this);
  54. btn2.setId(102);
  55. btn2.setText("exit");
  56. btn2.setOnClickListener(this);
  57. layout.addView(btn2,param);
  58. tv=newTextView(this);
  59. tv.setTextColor(Color.WHITE);
  60. tv.setText("");
  61. LinearLayout.LayoutParamsparam2=
  62. newLinearLayout.LayoutParams(FP,WC);
  63. param2.topMargin=10;
  64. layout.addView(tv,param2);
  65. setContentView(layout);
  66. }
  67. publicvoidonClick(Viewv){
  68. switch(v.getId()){
  69. case101:
  70. t=newmyThread();
  71. t.start();
  72. break;
  73. case102:
  74. finish();
  75. break;
  76. }
  77. }
  78. //------------------------------------------------------
  79. classEHandlerextendsHandler{
  80. publicEHandler(Looperlooper){
  81. super(looper);
  82. }
  83. @Override
  84. publicvoidhandleMessage(Messagemsg){
  85. tv.setText((String)msg.obj);
  86. }
  87. }
  88. //------------------------------------------------------
  89. classmyThreadextendsThread{
  90. privateEHandlermHandler;
  91. publicvoidrun(){
  92. LoopermyLooper,mainLooper;
  93. //取出本线程中的Looper,当然如果本句话放在主线程中,则会取得主线程的Looper
  94. myLooper=Looper.myLooper();
  95. //取出主线程中的Looper
  96. mainLooper=Looper.getMainLooper();
  97. Stringobj;
  98. if(myLooper==null){
  99. mHandler=newEHandler(mainLooper);
  100. obj="currentthreadhasnolooper,thismessageisfromMainthread!";
  101. }
  102. else{
  103. mHandler=newEHandler(myLooper);
  104. obj="Thisisfromnewthread.";
  105. }
  106. mHandler.removeMessages(0);
  107. Messagem=mHandler.obtainMessage(1,1,1,obj);
  108. mHandler.sendMessage(m);
  109. }
  110. }
  111. }

在本程序中Android仍然会自动替主线程建立Message Queue。在点击按钮之后,新生成的子线程中并不会建立Message Queue。所以,新线程中的myLooper值为null,而mainLooper则指向主线程里的Looper对象。于是,执行当到指令:
mHandler = new EHandler(mainLooper); 时这个mHandler是属于主线程的。
通过指令:mHandler.sendMessage(m); 便将消息m存入到主线程的Message Queue里。mainLooper看到Message Queue里有讯息,就会自动处理,主线程会自动回调mHandler的handleMessage()函数来处理消息。

本文出自 “最牛傻蛋的博客” 博客,转载请与作者联系!

更多相关文章

  1. Android异步更新UI的方式之使用AsyncTask异步任务
  2. java 课堂总笔记
  3. Android多线程下安全访问数据库
  4. EventBus for Android(安卓)源码分析
  5. 理解Android核心:Looper, Handler和HandlerThread
  6. ContentProvider使用难点
  7. 详解Android(安卓)Handler的使用
  8. UI与线程交互
  9. android线程模型文章集合

随机推荐

  1. Android(安卓)应用性能评估
  2. android基础的回顾(一)开发工具的转变---an
  3. Android(安卓)Canvas类介绍
  4. Google Android(安卓)简介
  5. 作为一名Android开发者,你有过迷茫吗?
  6. 提示服务Notification在Android中的应用
  7. 第11章 Android的线程和线程池
  8. Android与服务器端数据交互(http协议整合s
  9. android利用XmlPullParse对XML进行解析读
  10. Android(安卓)Web App官方文档翻译第一章