(请使用UTF-8编码阅读)全面介绍Android的消息处理机制,包括Handler、Looper、Message等,并深入到代码细节进行细致讲解。对于延伸的知识也一并涉及并讲解,使读者真正吃透。保证物超所值! ### Android消息机制理解及延伸 #### 一、消息机制概览 Android消息机制是Android应用程序中处理异步任务的关键组成部分,它主要涉及到四个核心组件:`Handler`、`Looper`、`Message` 和 `MessageQueue`。这些组件共同协作,实现了消息的发送、接收和处理过程。 **1.1 Handler** `Handler` 是一个类,主要用于发送和处理消息。它是连接`Message`和`Looper`的重要桥梁。`Handler`可以将消息发送到`MessageQueue`,然后由`Looper`负责从队列中取出消息并交给`Handler`处理。 **1.2 Looper** `Looper` 类维持着当前线程的消息循环。通常每个应用程序的主线程都有一个`Looper`实例,用于管理消息队列。`Looper`的核心功能是不断地从消息队列中取出消息,并分发给相应的`Handler`进行处理。 **1.3 Message** `Message` 是一个轻量级的对象,用于携带数据并在`Handler`之间传递。每个`Message`对象都可以携带额外的数据,如键值对形式的信息,以便于`Handler`在处理时使用。 **1.4 MessageQueue** `MessageQueue` 是一个消息队列,它用来存放所有待处理的消息。消息按照发送顺序或者指定的时间顺序存储。 #### 二、消息机制的主要流程 **2.1 Looper对象初始化** `Looper`对象用于生成线程对应的消息队列及进入消息循环。一个线程只能有一个`Looper`对象。`Looper.prepare()`方法准备了一个`Looper`实例,并与当前线程绑定。`Looper.loop()`方法则启动消息循环,不断从消息队列中取出消息,并分发给对应的`Handler`。 **2.2 Handler对象发送消息** 通过`Handler`对象发送消息,可以指定消息的内容和发送时间。例如,`sendMessage()`方法用于发送以当前时间为发送时间的消息;`sendMessageDelayed()`方法用于发送延迟消息,即消息的发送时间为当前时间加上指定的延迟时间。 **2.3 消息放入消息队列** 发送的消息会被放入相应的消息队列中等待处理。消息队列按照消息的发送时间和优先级进行排序。 **2.4 消息的分发与处理** 在消息循环中,`Looper`会不断地从消息队列中取出消息,并通过`Handler`进行分发。每个`Handler`对象都会有一个`handleMessage()`方法,该方法用于处理接收到的消息。 **2.5 消息的时序性** 通过创建消息时指定的时间对消息进行排序处理,从而保证消息的时序性。这意味着先发送的消息会在后发送的消息之前被处理。 #### 三、UI线程中的消息处理 **3.1 UI线程的消息循环** UI线程的消息循环是由系统框架自动生成并进行维护的。当应用程序启动时,系统会自动为UI线程创建一个`Looper`实例,并启动消息循环。 **3.2 线程本地变量的应用** 为了确保`Looper`对象在线程中的唯一性,Android使用了线程本地变量(`ThreadLocal`)来存储`Looper`实例。这样可以避免多个线程误操作同一个`Looper`实例的问题。 **3.3 弱引用的使用** 为了减少内存泄漏的风险,`Handler`对象持有对`Activity`或`Fragment`的弱引用。这意味着当`Activity`或`Fragment`不再被使用时,它们可以被垃圾回收器回收,即使`Handler`对象仍然存在。 **3.4 消息池技术** 为了提高发送消息的效率,Android使用了消息池技术。这意味着已处理过的消息会被放入消息池中,下次需要发送消息时可以从消息池中复用这些消息对象,而无需每次都新建`Message`对象。 #### 四、Handler类详解 **4.1 Handler类的方法** `Handler`类提供了多种方法用于发送和处理消息: - `dispatchMessage(Message msg)`:根据情况使用不同的处理函数处理消息。 - `getLooper()`:取得`Looper`对象。 - `handleMessage(Message msg)`:在没有回调函数的情况下,用于处理消息的函数。 - `sendMessage(Message msg)`:发送以当前时间为发生时间的消息。 - `sendMessageAtFrontOfQueue(Message msg)`:发送最高优先级的消息,消息的发生时间为0。 - `sendMessageAtTime(Message msg, long uptimeMillis)`:发送以参数时间为发生时间的消息。 - `sendMessageDelayed(Message msg, long delayMillis)`:发送延迟消息,消息的发生时间为当前时间加延迟时间。 - `post(Runnable action)`:包装回调函数并发送消息。 - `postAtFrontOfQueue(Runnable action)`:包装回调函数并发送最高优先级消息。 - `postAtTime(Runnable action, Object token, long uptimeMillis)`:包装回调函数并发送以参数时间为发生时间的消息。 - `postDelayed(Runnable action, long delayMillis)`:包装回调函数并发送延迟消息。 **4.2 在子线程中更新UI** 当需要在子线程中更新UI时,通常的做法是在主线程(UI线程)中定义一个`Handler`对象,并重写`handleMessage`方法用于处理消息。然后在子线程中通过调用`Handler`对象的`sendMessage`方法发送消息。这是因为Android的所有UI操作都必须在主线程中执行,否则会抛出`CalledFromWrongThreadException`异常。 **4.3 Activity对象的runOnUiThread方法** `Activity`对象的`runOnUiThread`方法实际上是通过`Handler`实现的。这个方法允许开发者在非UI线程中执行代码,并确保这些代码最终在UI线程中运行。这为开发者提供了一种简单的方式来更新UI而不必直接操作`Handler`。 #### 五、总结 Android的消息机制是一个非常重要的概念,它不仅关系到应用程序的响应性和性能,还涉及到多线程之间的通信。通过对`Handler`、`Looper`、`Message`和`MessageQueue`的理解,我们可以更好地控制应用程序的行为,优化用户体验。同时,合理利用消息机制中的各种特性,如消息池技术和弱引用,可以帮助我们构建更加健壮和高效的Android应用程序。
- hangejnu2012-02-07全面介绍Android的消息处理机制,包括Handler、Looper、Message.读者真正吃透
- 粉丝: 11
- 资源: 13
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Java-美妆神域_3rm1m18i_221-wx.zip
- springboot高考志愿智能推荐系统 LW PPT.zip
- web学校课程管理系统(编号:07471106).zip
- SpringBoot的校园服务系统(编号:61189239).zip
- 百货中心管理系统(编号:745621100)(1).zip
- 毕业生就业推荐系统(编号:0225912).zip
- game_patch_1.29.13.13020.pak
- 毕业生追踪系统(编号:13356163).zip
- 宾馆客房管理系统设计与实现(编号:70764218).zip
- 餐品美食论坛(编号:3118587).zip
- 仓库管理系统(编号:6809848).zip
- 大学生就业系统.zip
- 宠物管理系统.zip
- 大学生心理咨询平台(编号:40361285).zip
- 大学生校园线上招聘系统(编号:0926903)(1).zip
- 大学生就业信息管理系统_xb8ce10b_229-wx.zip