昨天研究了一下Handler的源码,今天总结一下:
android只有一个线程可以操作UI界面,我们称之为UI线程。
每个UI线程都维护一个looper,这个looper中有一个messagequeue来保存UI一个消息队列。通过控制这个消息队列来实现对UI界面的顺序刷新。
handler.sendMessage();
public final boolean sendMessage(Message msg)
{
return sendMessageDelayed(msg, 0);
}
public final boolean sendMessageDelayed(Message msg, long delayMillis)
{
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}
public boolean sendMessageAtTime(Message msg, long uptimeMillis)
{
boolean sent = false;
MessageQueue queue = mQueue;
if (queue != null) {
msg.target = this;
sent = queue.enqueueMessage(msg, uptimeMillis);//加入message到消息队列
}
else {
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("Looper", e.getMessage(), e);
}
return sent;
}
从以上代码我们可以得出一个结论,handler的所有sendMessage都是通过sendMessageAtTime来时实现的。关键的一行是queue.enqueueMessage这个方法。这里的queue是个messagequeue.
final boolean enqueueMessage(Message msg, long when) {
if (msg.when != 0) {
throw new AndroidRuntimeException(msg
+ " This message is already in use.");
}
if (msg.target == null && !mQuitAllowed) {
throw new RuntimeException("Main thread not allowed to quit");
}
synchronized (this) {
if (mQuiting) {
RuntimeException e = new RuntimeException(
msg.target + " sending message to a Handler on a dead thread");
Log.w("MessageQueue", e.getMessage(), e);
return false;
} else if (msg.target == null) {
mQuiting = true;
}
msg.when = when;
//Log.d("MessageQueue", "Enqueing: " + msg);
Message p = mMessages;
if (p == null || when == 0 || when < p.when) {
msg.next = p;
mMessages = msg;
this.notify();
} else {
Message prev = null;
while (p != null && p.when <= when) {
prev = p;
p = p.next;
}
msg.next = prev.next;
prev.next = msg;
this.notify();
}
}
return true;
}
以上代码可以看出,messagequeue本质上是一个链表,这个链表根据时间排序。这个链表其实就是一个消息队列。
剩下的就很简单了,取消息时只需要从这个消息队列中依次取得即可。
删除消息时,只需要根据what从这个链表中摘除对应的消息即可。
分享到:
相关推荐
Handler是Android系统中用于线程间通信的重要...以上是对Handler源码分析及面试问题解答的概述,深入理解这些知识点对于Android开发人员来说至关重要,有助于解决实际开发中遇到的问题,也能提高系统优化和调试的能力。
源码分析: Handler的`sendMessage(Message msg)`方法最终会调用`enqueueMessage(Looper looper, Message msg, long when)`,将消息插入到Looper的消息队列中。而Looper的`loop()`方法则不断地从消息队列中取出...
#### search_binary_handler源码分析 `search_binary_handler`函数用于查找处理特定类型二进制文件的处理器。根据不同的文件类型,可能需要不同的处理器来完成加载过程。 ```c int search_binary_handler(struct ...
Android Handler Message源码解析和手写实现
通过源码分析,我们可以看到`HttpServlet`接口的方法实际上是调用了`Service`方法,该方法由容器(如Tomcat)实现,负责调度请求到相应的`doXXX`方法。理解这个过程对于优化性能和调试问题至关重要。 总之,创建一...
在Handler的源码分析中,我们可以看到Handler的构造函数通常会与一个Looper关联,如果未指定Looper,则默认使用当前线程的Looper。`Looper.prepare()`方法用于初始化当前线程的Looper,`Looper.loop()`则启动消息...
【标题】中的“android2.2.3里面的handler源码”指的是Android系统中处理线程间通信的关键组件——Handler的源代码,这个版本对应的是Android 2.2.3(Froyo)系统。在Android开发中,Handler、Looper和Message是实现...
### Tomcat架构的源码分析 #### 一、Tomcat的架构概述 Tomcat作为一款广泛使用的开源Java Servlet容器,其内部架构设计简洁而高效。本文档将对Tomcat的架构进行详细介绍,并从源码层面深入分析其核心组成部分。...
"Android 开源框架源码分析" Android 是一个开源的操作系统,而其框架源码的分析则是其中一个非常重要的方面。今天,我们将对 Android 开源框架源码进行分析,涉及的内容包括 EventBus、Glide、OkHttp、Android ...
【Android_Handler01-源码】是一个关于Android Handler机制的源码分析项目。在Android开发中,Handler、Looper和Message是实现线程间通信的重要组件,尤其在UI更新和异步任务处理上扮演着核心角色。这个源码库可能是...
了Looper, Handler, Message这几个类的源码, 结果又一次被googler的设计震撼了, 特与大家分享。 android的消息处理有三个核心类: Looper,Handler和Message。 其实还有一个Message Queue(消息队列) , 但是MQ...
本文将详细分析Android Handler消息处理的顺序,以及如何利用这些组件进行异步操作。 首先,理解Handler的基本概念。Handler是Android中的一个类,用于发送和处理消息。它通常与Looper和Message配合工作,允许...
自定义架构源码分析 `CustomHandler-master`目录下可能包含以下关键文件: - `CustomHandler.java`:自定义的`Handler`类,实现了消息的处理逻辑。 - `MessageQueue.java`:可能是一个自定义的消息队列,用于存储...
4. 源代码分析:可能包含对Android系统源码中`Handler`、`Looper`相关部分的注释和解释,帮助理解它们的工作原理。 5. 测试用例:可能有针对`Handler`功能的测试代码,验证不同线程间的通信是否正常,消息处理是否...
这个"Netty源码分析总结.rar"压缩包文件,从其标题和描述来看,很可能是针对Netty的源码分析课程或者笔记的集合,其中包含了对Netty核心机制的深入探讨。尽管提供的子文件名是"课时34:Netty源码分析总结下期预告....
SpringMVC是目前主流的WebMVC框架之一,其源码分析涉及到一系列重要的接口和类,这些组件共同协作实现请求与Controller方法之间的映射关系。 首先,HandlerMethod类是Spring3.1版本之后引入的,它封装了方法参数、...
本篇将深入探讨如何利用`Handler`来更新Android的UI,并结合源码分析其工作原理。 `Handler`类是Android中的一个核心组件,它与`Looper`和`MessageQueue`一起构成了Android的消息处理系统。在Android应用启动时,...
"Android上百实例源码分析以及开源分析"集合提供了一系列实例,旨在帮助开发者更好地掌握Android应用开发的核心技术和最佳实践。这个资源包涵盖了多种Android应用开发中的常见问题和解决方案,通过实例源码,开发者...
1. **分析请求**:首先,Handler会检测到特定的URL请求,例如,当用户访问一个动态生成的页面时,Handler会被调用。 2. **数据获取**:然后,Handler需要获取必要的数据,这可能涉及到与数据库的交互、读取配置文件...