`
yangzc106
  • 浏览: 156693 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

handler源码分析

 
阅读更多

昨天研究了一下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源码分析流程以及面试问题解答

    Handler是Android系统中用于线程间通信的重要...以上是对Handler源码分析及面试问题解答的概述,深入理解这些知识点对于Android开发人员来说至关重要,有助于解决实际开发中遇到的问题,也能提高系统优化和调试的能力。

    android handler 机制 源码

    源码分析: Handler的`sendMessage(Message msg)`方法最终会调用`enqueueMessage(Looper looper, Message msg, long when)`,将消息插入到Looper的消息队列中。而Looper的`loop()`方法则不断地从消息队列中取出...

    Linux下ELF可执行文件载入过程源码分析

    #### search_binary_handler源码分析 `search_binary_handler`函数用于查找处理特定类型二进制文件的处理器。根据不同的文件类型,可能需要不同的处理器来完成加载过程。 ```c int search_binary_handler(struct ...

    Handler Message源码分析及手写实现02.mp4

    Android Handler Message源码解析和手写实现

    实战HTTP Handler (1) -- 创建一个最简单的HTTP Handler 源码

    通过源码分析,我们可以看到`HttpServlet`接口的方法实际上是调用了`Service`方法,该方法由容器(如Tomcat)实现,负责调度请求到相应的`doXXX`方法。理解这个过程对于优化性能和调试问题至关重要。 总之,创建一...

    花样使用Handler与源码分析

    在Handler的源码分析中,我们可以看到Handler的构造函数通常会与一个Looper关联,如果未指定Looper,则默认使用当前线程的Looper。`Looper.prepare()`方法用于初始化当前线程的Looper,`Looper.loop()`则启动消息...

    android2.2.3里面的handler源码,可用于学习,或用于java、javafx等项目,作为线程消息队列使用。.zip

    【标题】中的“android2.2.3里面的handler源码”指的是Android系统中处理线程间通信的关键组件——Handler的源代码,这个版本对应的是Android 2.2.3(Froyo)系统。在Android开发中,Handler、Looper和Message是实现...

    tomcat架构的源码分析

    ### Tomcat架构的源码分析 #### 一、Tomcat的架构概述 Tomcat作为一款广泛使用的开源Java Servlet容器,其内部架构设计简洁而高效。本文档将对Tomcat的架构进行详细介绍,并从源码层面深入分析其核心组成部分。...

    android开源框架源码分析

    "Android 开源框架源码分析" Android 是一个开源的操作系统,而其框架源码的分析则是其中一个非常重要的方面。今天,我们将对 Android 开源框架源码进行分析,涉及的内容包括 EventBus、Glide、OkHttp、Android ...

    Android_Handler01-源码.rar

    【Android_Handler01-源码】是一个关于Android Handler机制的源码分析项目。在Android开发中,Handler、Looper和Message是实现线程间通信的重要组件,尤其在UI更新和异步任务处理上扮演着核心角色。这个源码库可能是...

    android的消息处理机制(图+源码分析)——Looper,Handler,Message

    了Looper, Handler, Message这几个类的源码, 结果又一次被googler的设计震撼了, 特与大家分享。 android的消息处理有三个核心类: Looper,Handler和Message。 其实还有一个Message Queue(消息队列) , 但是MQ...

    Android Handler消息处理顺序分析

    本文将详细分析Android Handler消息处理的顺序,以及如何利用这些组件进行异步操作。 首先,理解Handler的基本概念。Handler是Android中的一个类,用于发送和处理消息。它通常与Looper和Message配合工作,允许...

    自己设计的Android简易版本Handler 框架及实现源码,对了解Android Handler原理有一定的参考价值

    自定义架构源码分析 `CustomHandler-master`目录下可能包含以下关键文件: - `CustomHandler.java`:自定义的`Handler`类,实现了消息的处理逻辑。 - `MessageQueue.java`:可能是一个自定义的消息队列,用于存储...

    androidHandler测试的demo

    4. 源代码分析:可能包含对Android系统源码中`Handler`、`Looper`相关部分的注释和解释,帮助理解它们的工作原理。 5. 测试用例:可能有针对`Handler`功能的测试代码,验证不同线程间的通信是否正常,消息处理是否...

    Netty源码分析总结.rar

    这个"Netty源码分析总结.rar"压缩包文件,从其标题和描述来看,很可能是针对Netty的源码分析课程或者笔记的集合,其中包含了对Netty核心机制的深入探讨。尽管提供的子文件名是"课时34:Netty源码分析总结下期预告....

    SpringMVC源码分析系列

    SpringMVC是目前主流的WebMVC框架之一,其源码分析涉及到一系列重要的接口和类,这些组件共同协作实现请求与Controller方法之间的映射关系。 首先,HandlerMethod类是Spring3.1版本之后引入的,它封装了方法参数、...

    利用Handler来更新android的UI

    本篇将深入探讨如何利用`Handler`来更新Android的UI,并结合源码分析其工作原理。 `Handler`类是Android中的一个核心组件,它与`Looper`和`MessageQueue`一起构成了Android的消息处理系统。在Android应用启动时,...

    Android 上百实例源码分析以及开源分析

    "Android上百实例源码分析以及开源分析"集合提供了一系列实例,旨在帮助开发者更好地掌握Android应用开发的核心技术和最佳实践。这个资源包涵盖了多种Android应用开发中的常见问题和解决方案,通过实例源码,开发者...

    ASP.NET源码——利用handler生成静态页面的完整解决方案.zip

    1. **分析请求**:首先,Handler会检测到特定的URL请求,例如,当用户访问一个动态生成的页面时,Handler会被调用。 2. **数据获取**:然后,Handler需要获取必要的数据,这可能涉及到与数据库的交互、读取配置文件...

Global site tag (gtag.js) - Google Analytics