android总结系列

一、消息系统构成要素和基本原理

l  消息队列

l  发送消息

l  消息读取

l  消息分发

l  消息循环线程

消息系统必须要依赖一个消息循环线程来轮询自己的消息队列,如果有消息进来,就调用消息处理函数,根据消息类型及其参数来作相应的处理。消息系统要运作起来,必定有消息的产生和消费。暂且把产生消息的线程叫做生产者线程,把消费消息的线程叫做消费者线程。生产者线程将消息发送到消息队列,消费者线程从消息队列中取出消息进行相应处理。当消息队列没有消息时,消费者线程便进入挂起状态,而当有新的消息到达时,消费者线程会被唤醒继续运行。当然生产者同时也可以是消费者。

二、消息模型基本原理

Android消息系统使用了Message、MessageQueue、Looper、Handler等概念,从消息系统的基本原理可以知道这些都是概念包装,本质的东西是消息队列中消息的分发处理方法。Android巧妙地利用了对象抽象技术抽象出了Looper和Handler的概念,并在Looper和handler概念的基础上,通过view的处理框架,十分完美的实现了消息分发的功能。下面就对message、MessageQueue、Looper、Handler进行详细的介绍。

1)Message

Message是消息对象,信息的载体。Message通常放在消息队列中。通常在创建Message实例对象时,使用Message类中的静态方法obtain(),该方法有多个重载版本可供选择。

使用obtain()方法获取Message时并不是直接创建一个新的实例,而是先从Message Pool中查看有没有可用的Message实例,如果有则直接复用;如果没有,则创建一个新的/message实例。调用removeMessage()可以把Message从Message Queue中删除,同时放入消息池中。除了使用obtain方法获取Messaeg之外,还可以通过Handler对象的obtainMessage方法获取。

2)MessageQueue

MessageQueue是一种数据结构,具有先进先出的特点,用来存放消息队列。每个线程最多拥有一个MessageQueue。通常使用Looper对象对线程的MessageQueue进行管理。Android应用程序在创建主线程时,会默认创建一个Looper对象,其他线程并不会自动创建Looper,但在需要的时候,可以调用Looper的prepare()函数创建。

3)Looper

Looper是MessageQueue的管理者。每一个MessageQueue都不能脱离Looper而单独存在,Looper对象是通过prepare函数创建的。Looper首先创建一个消息循环框架,然后创建消息队列并把它挂在Linux的线程上下文中,进入取消息并分发消息的循环。每一个Looper对象必须和一个线程关联起来。通过调用Looper的myLooper()可以获得当前线程的Looper对象。对于android。Looper检测MessageQueue是否有Message,有的话就把它广播出去,它对应的Handler接收到,调用handleMessage()方法。

4)Handler

Handler是消息系统的核心,Handler的作用是把消息加入特定的(Looper)消息队列中,并分发和处理该消息队列中的消息。构造Handler的时候可以指定一个Looper对象,如果不指定则利用当前线程的Looper创建。详细实现请参考Looper的源码。

如图:handler

  在这个图里handler是UIThread中创建的

  这个图是我自己画的,

在这个图里边handleThread是HandlerThread子线程中声明的Handler;handler是UIThread主线程中声明的Handler;从图中可以形象的看出子线程是怎么和主线程发消息的,即在`子线程中得到UIThread中的handler,通过handler的发送消息到主线程,在主线程中利用handleMessage方法执行操作。反过来在主线程给子线程发消息也一样。

再下边几篇文章中,将结合源码,代码实例详细介绍。

简析android消息模型的更多相关文章

  1. 结合源代码详解android消息模型

    Handler是整个消息系统的核心,是Handler向MessageQueue发送的Message,最后Looper也是把消息通知给Handler,所以就从Handler讲起. 一.Handler H ...

  2. 阿里客户端工程师试题简析——Android应用的闪退(crash)分析

    1. 问题描述 闪退(Crash)是客户端程序在运行时遭遇无法处理的异常或错误时而退出应用程序的表现,请从crash发生的原因分类与解决方法.在出现crash后如何捕捉并分析异常这两个问题给出自己的解 ...

  3. 简析Android 兼容性测试框架CTS使用

    一.什么是兼容性测试? 1)为用户提供最好的用户体验,让更多高质量的APP可以顺利的运行在此平台上 2)让程序员能为此平台写更多的高质量的应用程序 3)可以更好的利用Android应用市场 二.CTS ...

  4. zxing二维码扫描的流程简析(Android版)

    目前市面上二维码的扫描似乎用开源google的zxing比较多,接下去以2.2版本做一个简析吧,勿喷... 下载下来后定位两个文件夹,core和android,core是一些核心的库,android是 ...

  5. Android -- 多媒体播放之MediaPlayer使用内部实现简析

    Android -- MediaPlayer内部实现简析 在之前的博客中,已经介绍了使用MediaPlayer时要注意的内容.如今,这里就通过一个MediaPlayer代码实例,来进一步分析Media ...

  6. 功能强大的图片截取修剪神器:Android SimpleCropView及其实例代码重用简析(转)

    功能强大的图片截取修剪神器:Android SimpleCropView及其实例代码重用简析 SimpleCropView是github上第一个第三方开源的图片修剪截取利器,功能强大,设计良好.我个人 ...

  7. Java Android 注解(Annotation) 及几个常用开源项目注解原理简析

    不少开源库(ButterKnife.Retrofit.ActiveAndroid等等)都用到了注解的方式来简化代码提高开发效率. 本文简单介绍下 Annotation 示例.概念及作用.分类.自定义. ...

  8. Android 启动过程简析

    首先我们先来看android构架图: android系统是构建在linux系统上面的. 所以android设备启动经历3个过程. Boot Loader,Linux Kernel & Andr ...

  9. Android RecycleView + CardView 控件简析

    今天使用了V7包加入的RecycleView 和 CardView,写篇简析. 先上效果图: 原理图: 这是RecycleView的工作原理: 1.LayoutManager用来处理RecycleVi ...

随机推荐

  1. angularjs + seajs构建Web Form前端(二)

    回顾 上一篇讲解了引入bootstrap构建一个简单的登录页面,如何让angularjs自动启动并绑定视图,操作过程当中如何使用ui-bootstrap,继而完成简单功能后如何引入seajs后如何使n ...

  2. ROC和AUC介绍以及如何计算AUC ---好!!!!

    from:https://www.douban.com/note/284051363/?type=like 原帖发表在我的博客:http://alexkong.net/2013/06/introduc ...

  3. 写的一个Sass 和Compass的例子

    /*1.打开项目根目录下的 config.rb 文件 2.搜索 line_comments 关键词,默认应该是 # line_comments = false 3.去掉前面的 #,保存 config. ...

  4. Hadoop入门进阶课程5--MapReduce原理及操作

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan  ...

  5. 如何在java中使用sikuli进行自动化测试

    很早之前写过一篇介绍sikuli的文章.本文简单介绍如何在java中使用sikuli进自动化测试. 图形脚本语言sikuli sikuli IDE可以完成常见的单击.右击.移动到.拖动等鼠标操作,ja ...

  6. Fenix – 基于 Node.js 的桌面静态 Web 服务器

    Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...

  7. 通过Foxit和坚果云实现iPad和PC的pdf同步阅读(修改,笔记)

    这是解决我之后上班地铁上看书问题的一个关键部分 一个手持电子设备,不大不小 一个方便做笔记的笔 一个方便做笔记的阅读器软件 方便快速地同步(只同步标记最好了) 在查看很多建议以及自己尝试之后,总结了这 ...

  8. thread_fork/join并发框架2

    转自  http://blog.csdn.net/mr_zhuqiang/article/details/48300229 三.使用异步方式 invokeAll(task1,task2); 是同步方式 ...

  9. DataList分页访问FooterTemplate模板里的控件

    今天做DataList分页的时候,突然想把分页控件写在FooterTemplate模板里面,弄了很久都访问不到控件,终于发现问题所在,以下是访问FooterTemplate里控件的方法: <Fo ...

  10. 轻量级的移动 webapp 框架Jingle

    一大早爬起来,发现这样的一个东东,国产,感觉实用性很强,试着用用. 1.28补记: 试着用jingle做了一个网站的移动版,感觉如果在布局上要求不高的话 - 目前支持的布局只有list,还是挺不错,做 ...