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

直接看代码~~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<span style="font-size: 14px">/*** MessageQueue2.java* com.test** Function: TODO**   ver     date           author* ──────────────────────────────────*          2011-3-20      Leon** Copyright (c) 2011, TNT All Rights Reserved.
*/package com.test;
/*** ClassName:MessageQueue2* Function: TODO ADD FUNCTION* Reason:   TODO ADD REASON** @author   Leon* @version* @since    Ver 1.1* @Date    2011-3-20*/
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;public class MessageQueue2 extends Activity implements OnClickListener {private final int WC = LinearLayout.LayoutParams.WRAP_CONTENT;private final int FP = LinearLayout.LayoutParams.FILL_PARENT;public TextView tv;private myThread t;private Button btn, btn2, btn3;public void onCreate(Bundle icicle) {super.onCreate(icicle);LinearLayout layout = new LinearLayout(this);layout.setOrientation(LinearLayout.VERTICAL);btn = new Button(this);btn.setId(101);btn.setText("test looper");btn.setOnClickListener(this);LinearLayout.LayoutParams param =new LinearLayout.LayoutParams(100,50);param.topMargin = 10;layout.addView(btn, param); btn2 = new Button(this);btn2.setId(102);btn2.setText("exit");btn2.setOnClickListener(this);layout.addView(btn2, param);tv = new TextView(this);tv.setTextColor(Color.WHITE);tv.setText("");LinearLayout.LayoutParams param2 =new LinearLayout.LayoutParams(FP, WC);param2.topMargin = 10;layout.addView(tv, param2);setContentView(layout);}public void onClick(View v) {switch(v.getId()){case 101:t = new myThread();t.start();break;case 102:finish();break;}}
//------------------------------------------------------
class EHandler extends Handler {public EHandler(Looper looper) {super(looper);}@Overridepublic void handleMessage(Message msg) {tv.setText((String)msg.obj);}}
//------------------------------------------------------
class myThread extends Thread{private EHandler mHandler;public void run() {Looper myLooper, mainLooper;//取出本线程中的Looper,当然如果本句话放在主线程中,则会取得主线程的LoopermyLooper = Looper.myLooper();//取出主线程中的LoopermainLooper = Looper.getMainLooper();String obj;if(myLooper == null){mHandler = new EHandler(mainLooper);obj = "current thread has no looper,this message is from Main thread!";}else {mHandler = new EHandler(myLooper);obj = "This is from new thread.";}mHandler.removeMessages(0);Message m = mHandler.obtainMessage(1, 1, 1, obj);mHandler.sendMessage(m);}}
}
</span>

在本程序中 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()函数来处理消息。

转载自最牛网

本文链接地址: Android的消息机制(2)

转载于:https://www.cnblogs.com/tangchenglin/archive/2011/12/30/2307257.html

Android的消息机制(2)相关推荐

  1. Android异步消息机制

    2019独角兽企业重金招聘Python工程师标准>>> 目录介绍 1.Handler的常见的使用方式 2.如何在子线程中定义Handler 3.主线程如何自动调用Looper.pre ...

  2. Android的消息机制

    Android的消息机制(一) android 有一种叫消息队列的说法,这里我们可以这样理解:假如一个隧道就是一个消息队列,那么里面的每一部汽车就是一个一个消息,这里我们先忽略掉超车等种种因素,只那么 ...

  3. Android的消息机制简单总结

    参考文章: http://gityuan.com/2015/12/26/handler-message-framework/#next 参考资料: Android Framework的源码: Mess ...

  4. 聊一聊Android的消息机制

    2019独角兽企业重金招聘Python工程师标准>>> 聊一聊Android的消息机制 侯 亮 1概述 在Android平台上,主要用到两种通信机制,即Binder机制和消息机制,前 ...

  5. 《Android开发艺术探索》读书笔记 (10) 第10章 Android的消息机制

    第10章 Android的消息机制 10.1 Android消息机制概述 (1)Android的消息机制主要是指Handler的运行机制,其底层需要MessageQueue和Looper的支撑.Mes ...

  6. Android进阶知识树——Android Handler消息机制

    1.概述 在安卓程序启动时,会默认在主线程中 运行程序,那如果执行一些耗时的操作则UI就会处于阻塞状态,出现界面卡顿的现象,再者用户的多种操作,系统是如何做到一一处理的,系统又是如何管理这些任务的,答 ...

  7. Android 开发艺术探索——第十章 Android的消息机制

    Android 开发艺术探索--第十章 Android的消息机制读书笔记 Handler并不是专门用于更新UI的,只是常被用来更新UI 概述 Android的消息机制主要值得就是Handler的运行机 ...

  8. 【学习】Android的消息机制

    Android的消息机制主要指Handler的运行机制,而Handler的运行需要MessageQueue和Looper支撑 前置知识 MessageQueue:消息队列,内部以单链表的形式存储消息列 ...

  9. 【安卓学习笔记】Android Handler 消息机制探究

    一.概述 1.android消息机制的含义: Android消息机制,其实指的就是 Handler 的运行机制,而 Handler 要正常运作,又需要底层的 MessageQueue , Looper ...

最新文章

  1. Java Mail 邮件发送(一):入门Demo
  2. python打开界面是什么样的-python学习笔记(图形用户界面)
  3. C++简单使用priority_queue
  4. shfflenetv2代码解读
  5. 小米用户画像_鹅智库发布手机品牌用户画像 一二线城市最爱小米 5G领域或占先机...
  6. 理解webpack原理,手写一个100行的webpack
  7. Spring 3.0参考之SpEL
  8. 贪心+优先队列 HDOJ 5360 Hiking
  9. c语言割线法解非线性方程,用割线法解非线性方程组.doc
  10. 谷粒商城:10.商品服务 — 属性分组
  11. Java 中extends与implements使用方法
  12. Testbench编写常用语法和必备知识
  13. Ajaxsubmit表单提交
  14. 『互联网架构』kafka集群搭建和使用
  15. 微信公众号文章怎么制作?
  16. 野火指南者(STM32F103)移植LVGL
  17. CentOS通过DNSpod实现DDNS动态域名,在家也可以搭建主机服务器了
  18. 微信小程序之收藏的实现2020-05-16
  19. nginx用法总结【1】
  20. 个人网站个人主页的建立

热门文章

  1. 重磅丨We Are SocialHootsuite:2018全球数字报告
  2. 《2020城市大脑全球标准研究报告》全文正式开放申领
  3. 杨振宁眼中的物理学之美
  4. OpenAI最新研究:如何通过无监督学习提升「自然语言理解能力」?
  5. 化解谷歌AI霸权的另一种思路?开发平台的生态围剿
  6. 外界对程序员的误解究竟有多深?
  7. 快来支招~程序员怎么哄女朋友? | 每日趣闻
  8. 别学前端了!前端程序员:凭啥??网友:来钱太快你会飘!
  9. 28 岁退休程序员自述:不是富二代,行政专业出身,非典型程序员
  10. 五个为你的设计添加光影效果的简单技巧(转)