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. Tensorflow手写数字识别(交叉熵)练习

    # coding: utf-8import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data #pr ...

  2. WordCount 编码与测试

    word count github 项目地址:https://github.com/liuqiang666/wordCount PSP表格 PSP2.1  PSP阶段  预估耗时(小时)  实际耗时( ...

  3. 《Head First Servlets & JSP》-9-使用JSTL

    安装JSTL1.1的说明 JSTL1.1不是JSP2.0规范的一部分,能访问servlet和JSP API并不意味着能访问JSTL. 使用JSTL之前,需要将jstl.jar文件安装到Web应用的WE ...

  4. java打成jar包后,class,getResource()出现null指针异常

    1.SqlHelper.java有包路径没?如果有,是不是类似于com.db.jdbc? 不管怎么办,你SqlHelper.class.getResourceAsStream("/mysql ...

  5. Visual Studio 2017中如何创建安装打包项目

    从Visual Studio 2012开始,微软就不在环境中自动集成安装打包项目了,如果还想使用,需要手动下载安装,这里以在Visual Studio 2017上安装打包项目为例进行介绍,步骤如下: ...

  6. c++滚动数组

    说来惭愧,我老早以前就学习了dp,可直到最近才知道滚动数组. 所以说,滚动数组是什么呢? 它是一种优化dp空间复杂度的思想. 在dp转移时,我们往往不需要之前推的所有的,而是只需要前一两个转移的. 我 ...

  7. Docker-教程(一)CentOS Docker 安装

    Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 前提条件 目前,CentOS 仅发行版本中的内核支持 Docker. ...

  8. java基础之变量和常量、类型转换

    一.     变量 变量是可改变的量,每赋个值便会开辟一个新内存地址. 1.首先,变量需要一个声明,例如:int a,这个a也可以当作是一个标签,它指向了一个内存地址,这个地址是属于int类型的套餐, ...

  9. django 基础框架学习 (三)

    Django框架基础-03数据库新增数据    1.save⽅法        >>> from datetime import date        >>> f ...

  10. P5056 【模板】插头dp

    \(\color{#0066ff}{ 题目描述 }\) 给出n*m的方格,有些格子不能铺线,其它格子必须铺,形成一个闭合回路.问有多少种铺法? \(\color{#0066ff}{输入格式}\) 第1 ...