handler机制要做的事情

  1.把一堆从四面八方传来的message加到一个队列中,这个队列就是MessageQueue。

  2.将MessageQueue中的队头Message取出,并使用这个message自带的handler来handleMessage。

稍微有些特别的是,handler将这两件事分成两个线程来处理,这样就保证了服务器能在处理msg1的同时将msg2入队。

所以Message.java就是链式队列MessageQueue中的Node,特别的是除了要存基本的信息之外,还要保存一个Handler,这样处理消息的线程就知道应该如何处理这条消息。

上面说了Message.java 和MessageQueue.java,接下来说Handler.java和Looper.java。

Handler.java

  一个处理msg的工具,它有两个方法:sendMessage()和handleMessage(),上面说的那两件事就是分别用这两个方法来完成的。

  要注意的是,Handler中存了一个MessageQueue,这个mq与Looper中的mq相关联,换句话说,这两个mq共用一个内存单元。怎样实现这件事呢:handler的构造函数要传入一个Looper,handler在初始化时将handler的mq指向looper的mq。

Looper.java:

  这个东西有点抽象,做一个比喻,Message是鸡腿、MessageQueue是冰箱、Handler就是两个动作:把鸡腿放冰箱里;把鸡腿拿出来并且吃掉。这样来看有了上面三个程序,好像我已经可以把鸡腿放冰箱里并且拿出来吃掉了,那为什么要有looper这个东西?

  looper在这里做的事情应该说很灵魂了,有两点:

    1.它保存了最重要的东西:mq,也就是looper才知道冰箱在哪里,甚至说这个冰箱是looper创建的。

    2.loop()是一个死循环,这个循环里不断执行两个动作:把鸡腿拿出来并且吃掉。也就是上面说的handler机制要做的第二件事:消息出队并处理消息。

  所以说,如果没有looper我甚至不知道有鸡腿的冰箱在哪,我虽然会拿鸡腿、吃鸡腿这两个动作,但我并不知道要这样做,没有looper我就是一个吃不到鸡腿的小可怜!

  消息入队的线程:不停的进行消息入队这个动作,每个msg自带一个target:handler,所以它被放入这个handler的mq中,而handler在初始化时就将自己的mq指向了looper中的mq。

  消息出队并处理消息的线程:这个线程调用了loop(),不停的从mq中取出队头元素,这个mq正是这个looper中保存的mq,也就是消息入队线程中handler指向的那个mq。

这样两个线程就对同一个mq同时执行不同的动作。

java——极简handler机制的更多相关文章

  1. 资源对象的池化, java极简实现,close资源时,自动回收

    https://www.cnblogs.com/piepie/p/10498953.html 在java程序中对于资源,例如数据库连接,这类不能并行共享的资源对象,一般采用资源池的方式进行管理. 资源 ...

  2. Android Handler 机制总结

    写 Handler 原理的文章很多,就不重复写了,写不出啥新花样.这篇文章的主要是对 handler 原理的总结. 1.Android消息机制是什么? Android消息机制 主要指 Handler ...

  3. 极简 Node.js 入门 - 2.4 定时器

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  4. Android的Handler机制

    Handler机制的原理 Android 的 Handler 机制(也有人叫消息机制)目的是为了跨线程通信,也就是多线程通信.之所以需 要跨线程通信是因为在 Android 中主线程通常只负责 UI ...

  5. java的动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  6. 浅说Java中的反射机制(二)

    写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...

  7. Resty 一款极简的restful轻量级的web框架

    https://github.com/Dreampie/Resty Resty 一款极简的restful轻量级的web框架 开发文档 如果你还不是很了解restful,或者认为restful只是一种规 ...

  8. Java的动态代理机制详解(转)

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  9. Handler机制原理图、源码、使用!!!!!

    android的消息处理机制——Looper,Handler,Message  (原理图.源码) 转自:http://my.oschina.net/u/1391648/blog/282892 在开始讨 ...

随机推荐

  1. DB2--sql计算时间差和格式化时间

    格式化时间 db2 格式化时间使用的 TO_CHAR(TIMESTAMP('2017-10-24 21:18:12'),'YYYY-MM-DD'): 测试sql:SELECT TO_CHAR(TIME ...

  2. 34- 24 Point game

    http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=43 24 Point game 时间限制:3000 ms  |  内存限制:65535 KB ...

  3. Luogu 3530 [POI2012]FES-Festival

    我是真的不会写差分约束啊呜呜呜…… BZOJ 2788被权限了. 首先对于第一个限制$x + 1 = y$,可以转化成$x + 1 \leq y \leq x + 1$, 所以连一条$(y, x, - ...

  4. 数据结构_coprime_sequence(互质序列)

    coprime_sequence(互质序列) 问题描述 顾名思义,互质序列是满足序列元素的 gcd 为 1 的序列.比如[1,2,3],[4,7,8],都是互质序列. [3,6,9]不是互质序列.现在 ...

  5. C++笔记--类型和声明

    布尔量 Eg: bool b1=a==b;//这个例子中,=是赋值,==是判断是否相等,所以先是判断是否相等,a如果等于b,b1的值就是true,否则就是false了 Bool经常被用作检查某些条件是 ...

  6. js/jq基础(日常整理记录)-4-一个简单的自定义tree插件

    一.一个简单的自定义tree插件 上一篇是之前自定义的table插件,这一篇也是之前同期尝试做的一个tree插件. 话不多说,先看看长什么样子哈! 现在来看确实不好看,以后在优化吧! 数据源:ajax ...

  7. unit vs单元测试

    vs单元测试(unit) 一.什么是单元测试及它的作用? 在小量代码编写时,往往可以通过新建控制台项目(Console Application),新建网站项目(Web Form)等,在其中敲入测试代码 ...

  8. Go语言环境安装-Mac

    1.环境安装 Go SDK下载和安装,下载地址为:https://golang.org/dl/ Visual Studio Code下载和安装,下载地址为:https://code.visualstu ...

  9. ubuntu17.04安装flash

    因为用不了软件商店(别问我为什么) 所以手动安装 1 下载文件 在firefox下下载  *****.tar.gz 压缩包 ,并解压(一般目录在 /home 当前用户下的 下载目录下) adobe官网 ...

  10. A - Chips

    Gerald plays the following game. He has a checkered field of size n × n cells, where m various cells ...