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. ps裁剪圆角

    1.打开要编辑的图片 2.选择圆角矩形工具,并调整半径(半径越大,角越圆),本例半径为20像素 3.使用上述工具画出选区 4.按下ctrl+enter,可以看到选区边缘描上了虚线 5.菜单栏-图像-剪 ...

  2. Windows 10 Weather App无法正常显示解决方法

    Weather动态磁贴显示Washington(不知是否和我的region设置有关系),打开应用却停留在输入需要搜索的天气.根据提示输入"Shanghai, China"并单击搜索 ...

  3. 不使用ajax,无刷新提交表单

    <form action="form_action.asp" method="get" onsubmit"check_form()" ...

  4. smartjs 0.3 DataManager 发布&介绍

    在0.3版加入了DataManager,基于策略的数据管理模块:是SmartJS中比较重要的一个系列.整个个DataManager模块包括有:dataManager,dataPolicyManager ...

  5. Enjoy Android

    大趋势所迫,开始学习Android, @mark一下

  6. 使用log4net

    原文:<使用log4net,没有日志文件生成> Posted on 2014/06/12 ================================================= ...

  7. ruby -- 问题解决(二)rails4.0create引起的ActiveModel::ForbiddenAttributesError错误

    之前将rails升级到4.0版本,发生了ActiveModel::ForbiddenAttributesError错误 于是上网溜达了一会,找到解决方案, ActiveModel::Forbidden ...

  8. OP和DBA相关的一些有用资源

    最近国外blog上看到的一片资源分享博文,精而全,于是转帖分享 Must-Read Books List First of all, I would like to share a list of b ...

  9. Android注解编程的第一步---模仿ButterKnife的ViewBinder机制

    ButterKnife的使用极大方便了Android程序员的开发,实际上,我们可以自己模仿一下实现. 首先就是要了解Java注解的使用. 我们首先要声明一个@interface,也就是注解类: @Ta ...

  10. js-弹出窗口

    一.JS最常用三种弹出对话框 1.对话框 //弹出对话框并输出一段提示信息 function ale() { //弹出一个对话框 alert("提示信息!"); } 2.询问框 / ...