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. teamcity设置

    建立项目后首先要设置svn地址,并绑定 名字随便起 url是svn的地址 之后来做build step 有一个按钮可以自动检测,一般都能检测出来 执行这个似乎需要代理装什么东西 可以查看目前代理有那些 ...

  2. 在Eclipse中进行HotSpot的源码调试--转

    原文地址:http://www.linuxidc.com/Linux/2015-05/117250.htm 在阅读OpenJDK源码的过程中,经常需要运行.调试程序来帮助理解.我们现在已经可以编译出一 ...

  3. Java sun.misc.Unsafe类的学习笔记

    Java未开源的Unsafe类 Unsafe类可以为我们提供高效并且线程安全方式操作变量,直接和内存数据打交道. 获取Unsafe实体的方法 private static Unsafe getUnsa ...

  4. 【推荐】iOS汉字转拼音第三方库

    PinYin4Objc是一个在git汉字转拼音的开源库,支持简体和繁体中文.效率POAPinyin等其他库要高,转换库也完整下面简单介绍 实现原理 使用unicode_to_hanyu_pinyin. ...

  5. 0527Sprint总结,读书笔记与提问

    第八章主要软件团队如何准确全面的找到人们对于软件五花八门的需求,主要有以下几个步骤: 1.获取和引导需求 2.分析和定义需求 3.验证需求 4.在软件产品的生命周期中管理需求 . 接下来讲了软件产品的 ...

  6. 微软参考源代码 referencesource.microsoft.com

    微软参考源代码 http://referencesource.microsoft.com/ referencesource 下载地址 https://github.com/Microsoft/refe ...

  7. jquery.ajax 跨域请求webapi,设置headers

    解决跨域调用服务并设置headers 主要的解决方法需要通过服务器端设置响应头.正确响应options请求,正确设置 JavaScript端需要设置的headers信息 方能实现. 1.第一步 服务端 ...

  8. ASP.NET文本框密码赋默认值的方法

    对于普通的文本输入框,可以使用下边的方法赋默认值: <asp:TextBox ID="TextBox1" runat="server">12345& ...

  9. [新手学Java]使用内省(Introspector)操作JavaBean属性

    获取类bean中的所有属性: @Test //获取类bean中的所有属性 public void test1() throws Exception{ BeanInfo info = Introspec ...

  10. android studio...混淆打包全揭秘

    前言,当前android studio使用的版本较新,低版本的如果有差异,或者问题,欢迎拍砖! 1.修改配置文件 找到配置文件,build.gradle,修改如下.    signingConfigs ...