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. 聊一聊google的Knowledge Graph

    什么是Knowledge Graph? 它是google用于增强它的搜索引擎的功能和提高搜索结果质量的一种技术.在2012年5月16日提出,除了提供基本的与主题相关的链接服务之外,它还能结构化与主题相 ...

  2. 如何在mac os中安装gdb及为gdb进行代码签名

    1. 安装gdb GDB作为一个强大的c/c++调试工具,一直是程序猿们的良好伴侣,但转到Mac os才发现竟然没有默认安装,所幸还有强大的homebrew工具: brew install homeb ...

  3. [Design Patterns] 1. Primary concept & term - UML

    It's time to review design patterns, especially when I reach the turning-point of my career. That's ...

  4. tar的-t参数使用

    -t, --list           list the contents of an archive 例如: pengdl@localhost:~/test$ tar -czvf shell.ta ...

  5. Win7以上 32/64位系统隐藏托盘图标

    前两天有朋友找我,让帮忙写个小工具,隐藏windows的托盘图标,想想最近在家也不想做太复杂的事,也好几年没写过windows上的小工具了,就答应了.想来挺简单的事,没想到还是有点小插曲的.特地来博客 ...

  6. Python单元测试框架之pytest -- fixtures

    fixtures不太好翻译,可看作是夹心饼干最外层的两片饼干.通常用setup/teardown来表示.它主要用来包裹测试用例,为什么需要这样的饼干呢?我们以web自动化测试为例,例如,要测试的某系统 ...

  7. iOS-App的启动页设置

    一. 要求 1. 把一张图片设置成为启动页面. 二. 准备工作 1. 把准备的适配的(@1x,@2x,@3x)三张图片拖进工程中. 2. 打开LaunchScreen.storyboard. 在页面上 ...

  8. const与readonly深度分析(.NET)

    前言 很多.NET的初学者对const和readonly的使用很模糊,本文就const和readonly做一下深度分析,包括: 1. const数据类型的优势 2. const数据类型的劣势 3. r ...

  9. 实现java 中 list集合中有几十万条数据,每100条为一组取出

    解决"java 中 list集合中有几十万条数据,每100条为一组取出来如何实现,求代码!!!"的问题. 具体解决方案如下: /** * 实现java 中 list集合中有几十万条 ...

  10. 环信SDK与Apple Watch的结合(3)

    第3章主要介绍怎样在Watch App的页面上显示iPhone程序里的数据.主要操作的是“EMWatchOCDemo WatchKit Extension”这个文件夹,附源码EMWatchOCDemo ...