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. CF 1025C Plasticine zebra

    昨晚忘记判只有一个字符的情况fst了呜呜呜 挺有趣的题,昨晚连刚带猜弄出结论 考虑答案的取值,最优答案可能是一个后缀,或者是一个前缀,或者是一个后缀加上前缀 那么翻转之后最优答案的可选值就有了1的前缀 ...

  2. 之前在不网站看到过关于css的一些例子 今天自己也写了一个css特效

    下面是代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...

  3. SDUT 2107 图的深度遍历

    图的深度遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 请定一个无向图,顶点编号从0到 ...

  4. 数据结构_XingYunX(幸运儿)

    数据结构_XingYunX(幸运儿) 问题描述 泡泡最近下了个饱了吗 app,这个 app 推出了个坑蒙拐骗的红包系统,只要花一块钱买张一元抵用券,就有参与 20 元红包的抽奖机会,抽奖界面会实时显示 ...

  5. GTXE_COMMON

    http://forums.xilinx.com/xlnx/board/crawl_message?board.id=IMPBD&message.id=9657 If you are usin ...

  6. leetcode 6 ZigZag Converesion

    class Solution { public: string convert(string s, int nRows) { if (nRows <= 1) return s; string r ...

  7. Algorithms - Merging Sort

    印象 图1 使用合并排序为一列数字进行排序的过程 思想 归并排序是典型的分治算法,它不断地将某个数组分为两个部分,分别对左子数组与右子数组进行排序,然后将两个数组合并为新的有序数组. 分析 稳定: 是 ...

  8. CSS预处理器(SASS和LESS)

    Sass框架应用Sass简介 Sass又名SCSS,是CSS预处理器之一,它能让你更好更轻松的工作.Sass官网是这样描述Sass的:**Sass是一门高于CSS的元语言,能用来清晰的.结构化地描述文 ...

  9. iOS状态栏、导航栏的设置

    简单的参考 1.状态栏(statusBar) 默认:黑色 改变为白色: 1.1 第一步: info.plist中添加View controller-based status bar appearanc ...

  10. ASP.NET-GridView之表头设计

    我们 见过许多网页呈现表格的 时候,表头的形式多种多样.下面来看看,怎么制定多样的表头吧. 效果显示: 需要在后台写一个方法,网页一加载在前端写个事件调用这个方法. DEMO 前端 <span ...