java——极简handler机制
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机制的更多相关文章
- 资源对象的池化, java极简实现,close资源时,自动回收
https://www.cnblogs.com/piepie/p/10498953.html 在java程序中对于资源,例如数据库连接,这类不能并行共享的资源对象,一般采用资源池的方式进行管理. 资源 ...
- Android Handler 机制总结
写 Handler 原理的文章很多,就不重复写了,写不出啥新花样.这篇文章的主要是对 handler 原理的总结. 1.Android消息机制是什么? Android消息机制 主要指 Handler ...
- 极简 Node.js 入门 - 2.4 定时器
极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...
- Android的Handler机制
Handler机制的原理 Android 的 Handler 机制(也有人叫消息机制)目的是为了跨线程通信,也就是多线程通信.之所以需 要跨线程通信是因为在 Android 中主线程通常只负责 UI ...
- java的动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- 浅说Java中的反射机制(二)
写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...
- Resty 一款极简的restful轻量级的web框架
https://github.com/Dreampie/Resty Resty 一款极简的restful轻量级的web框架 开发文档 如果你还不是很了解restful,或者认为restful只是一种规 ...
- Java的动态代理机制详解(转)
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- Handler机制原理图、源码、使用!!!!!
android的消息处理机制——Looper,Handler,Message (原理图.源码) 转自:http://my.oschina.net/u/1391648/blog/282892 在开始讨 ...
随机推荐
- js定时任务
<input type="button" id="btn" value="保存图片" onclick="settime(th ...
- 如何把VS2015中本地的一个项目建立远程的Git Repository
在项目开发中,我在本地自己电脑上用VS2015建立了一个项目,比如项目名字叫做Luke.Test 那么,接下来,我如何把这个项目签入到远程的Git Repository里去呢. 方法如下 先进入远程R ...
- LeetCode第111题:二叉树的最小深度
问题描述 给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null,1 ...
- widget自定义控件【android.view.InflateException: Binary XML file line #2: Error inflating class...】
此错误比较难定位,场景是这样的:在一个widget中使用了自定义控件,始终会报 android.view.InflateException: Binary XML file line #2: Erro ...
- 关于UI Automation框架
微软提供的UI Automation框架给开发windows平台的自动化测试带来了很大的便利,这里就总结一下相关的代码. 首先,直接使用UI Automation框架,完成一个NotePad的abou ...
- Spring Boot 学习系列(05)—自定义视图解析规则
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 自定义视图解析 在默认情况下Spring Boot 的MVC框架使用的视图解析ViewResolver类是C ...
- epoll简介
1.epoll简介 epoll是I/O事件通知工具,与select/poll相比,epoll最大的好处在于它不会随着监听fd数目的增长而效率降低.epoll API既可以用作edge触发的接口,也可以 ...
- 洛谷P4137 Rmq Problem / mex(莫队)
题目描述 有一个长度为n的数组{a1,a2,…,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. 输入输出格式 输入格式: 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问l, ...
- JBOSS AS 性能调整优化
1 减少日志的输出量 *\jboss-4.2.3.GA\server\default\conf\jboss-log4j.xml 根据不同的日志级别:一共有5个等级,越往下输出的东西越详细.一般没什么特 ...
- DP【洛谷P3089】 [USACO13NOV]POGO的牛Pogo-Cow
[洛谷P3089] [USACO13NOV]POGO的牛Pogo-Cow FJ给奶牛贝西的脚安装上了弹簧,使它可以在农场里快速地跳跃,但是它还没有学会如何降低速度. FJ觉得让贝西在一条直线的一维线路 ...