内容回顾:
(1)UI thread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。
(2)当然需要一个Looper对象,来管理该MessageQueue。
(3)我们可以构造Handler对象来push新消息到Message Queue里;或者接收Looper(从Message Queue取出)所送来的消息。
(4)线程A的Handler对象可以传递给别的线程,让别的线程B或C等能送讯息来给线程A(存于A的Message Queue里)。
(5)线程A的Message Queue里的消息,只有线程A所属的对象可以处理。
子线程传递消息给主线程的例子:
1 public class Activity2 extends Activity implements OnClickListener{
2 Button button = null;
3 TextView text = null;
4 MyHandler mHandler = null;
5 Thread thread ;
6 @Override
7 protected void onCreate(Bundle savedInstanceState) {
8 super.onCreate(savedInstanceState);
9 setContentView(R.layout.activity1);
10 button = (Button)findViewById(R.id.btn);
11 button.setOnClickListener(this);
12 text = (TextView)findViewById(R.id.content);
13 }
14 public void onClick(View v) {
15 switch (v.getId()) {
16 case R.id.btn:
17 thread = new MyThread();
18 thread.start();
19 break;
20 }
21 }
22 private class MyHandler extends Handler{
23 public MyHandler(Looper looper){
24 super(looper);
25 }
26 @Override
27 public void handleMessage(Message msg) {//处理消息
28 text.setText(msg.obj.toString());
29 }
30 }
31 private class MyThread extends Thread{
32 @Override
33 public void run() {
34 Looper curLooper = Looper.myLooper();
35 Looper mainLooper = Looper.getMainLooper();
36 String msg ;
37 if(curLooper==null){
38 mHandler = new MyHandler(mainLooper);
39 msg = "curLooper is null";
40 }else{
41 mHandler = new MyHandler(curLooper);
42 msg = "This is curLooper";
43 }
44 mHandler.removeMessages(0);
45 Message m = mHandler.obtainMessage(1, 1, 1, msg);
46 mHandler.sendMessage(m);
47 }
48 }
49 }
说明:
Android会自动替主线程建立Message Queue。在这个子线程里并没有建立Message Queue。所以,myLooper值为null,而mainLooper则指向主线程里的Looper。于是,执行到:
mHandler = new MyHandler (mainLooper);此mHandler属于主线程。
mHandler.sendMessage(m);就将m消息存入到主线程的Message Queue里。
mainLooper看到Message Queue里有讯息,就会作出处理,于是由主线程执行到mHandler的handleMessage()来处理消息。
分享到:
相关推荐
内容概要:本文详细介绍了Java异常处理机制在Android开发中的应用,涵盖异常的基础概念、分类、生命周期,try-catch-finally结构,自定义异常的创建和使用,以及异常调试技巧。通过具体示例,解释了如何在不同场景中...
Android 中异步消息处理机制也就是 Handler 消息处理机制。主要由四个部分组成:Message、Handler、MessageQueue 和 Looper。 处理过程:在主线程中绑定 Handler 对象,并在事件触发上面创建子线程用于完成耗时操作...
②为面试准备提供全面的知识体系和答题思路;③提升开发者对Android系统架构的理解,以便更好地优化应用性能和用户体验。 其他说明:文档不仅提供了理论知识,还结合了实际案例和代码片段,有助于读者在实践中理解和...
----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...
适合人群:初学者和有一定经验的Android开发者,尤其是那些想要深入了解SQLite数据库操作、闹钟提醒机制和其他Android基础知识的人。 使用场景及目标:① 学习如何在Android应用中集成日历视图和SQLite数据库;② ...
内容概要:本文详细介绍了基于Android平台的单机购物商城系统,涵盖从用户注册、登录、购物车、订单处理到支付模拟等多个核心功能模块。系统采用SQLite进行本地数据存储,确保在无网络情况下仍能正常运行。文章深入...
内容概要:本文详细介绍了Volley框架,这是Google于2013年推出的Android平台网络通信库,专为简化网络请求处理而设计,尤其适用于数据量不大但通信频繁的应用场景。Volley的主要特点包括自动调度网络请求、多并发...
- **处理回调:** 由于JavaScript是异步的,因此在JS调用Android方法后,通常需要提供一个回调机制,例如通过`WebView.postMessage()`和`WebChromeClient.onJsMessage()`来传递消息。 3. **标签中的关键词解析:**...
适合人群:对Android底层架构感兴趣的开发者,尤其是有一定编程经验,希望深入了解HAL层工作机制的技术人员。 使用场景及目标:①帮助读者理解HAL层在整个Android框架中的位置和作用;②掌握Camx和CHI各自的特点和...
其他说明:本文详细描述了 SDK的各个模块的功能设计和实现过程,包括编辑模块的界面修改、数据收集模块的数据处理和数据发送模块的数据传输机制。此外,还通过功能性测试和非功能性测试验证了 SDK的稳定性和性能表现...
3.2 缓存处理机制 18 3.2.1 跨域缓存处理 18 3.2.2页面回退管理 18 3.3 模块实现 19 3.3.1跨域缓存机制的主要实现 19 3.3.2.页面回退管理的实现 22 3.4本章小结 22 第四章 页面自适应机制设计 23 4.1页面兼容策略 23...
内容概要:本文深入介绍了 Kotlin 这一基于JVM的现代编程语言,着重讨论了其广泛的跨平台适应能力以及...②需要进行Android App或者Web前后端一体化开发的相关技术人员;③正在考虑将现有系统从其他语言转向采用 Kot
在Android平台上,开发游戏时,音频的播放是一个重要的组成部分,为玩家提供沉浸式的游戏体验。在给定的“用zgf播放游戏声音”的主题中,我们可以深入探讨如何使用ZGF(可能代表一个自定义的游戏框架)提供的声音API...
系统采用了Spring Boot + Spring Cloud作为核心技术栈,重点介绍了分布式事务、微服务架构、移动端适配、权限控制、支付模块扩展、缓存策略、错误处理机制等方面的技术实现。文章不仅展示了各个模块的具体代码片段,...
文章首先概述了GDBus框架的特点,指出其适用于Linux X86、Linux ARM和Android等多个平台。接着通过具体代码示例展示了如何定义接口、处理方法调用、注册对象以及启动主循环。文中还讨论了框架的跨平台优势,特别是在...
首先介绍了计算机系统的硬件组成,包括中央处理器(CPU)、存储器、输入/输出设备等,并详细解释了CPU的结构、性能指标和缓存机制。接着阐述了操作系统的分类及常见操作,列举了Windows、macOS、Linux、iOS、Android...
文中详细展示了如何快速搭建监控系统,如温度监控界面的创建,并解释了其‘无限点’特性和高效的数据处理机制。此外,还讨论了软件在实际应用场景中的优势,如养猪场环境监控系统的构建。 适用人群:适用于工农业...