Andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。

1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。 
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。
3) Message Queue(消息队列):用来存放线程放入的消息。

4)线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。

1.Handler创建消息

    每一个消息都需要被指定的Handler处理,通过Handler创建消息便可以完成此功能。Android消息机制中引入了消息池。Handler创建消息时首先查询消息池中是否有消息存在,如果有直接从消息池中取得,如果没有则重新初始化一个消息实例。使用消息池的好处是:消息不被使用时,并不作为垃圾回收,而是放入消息池,可供下次Handler创建消息时使用。消息池提高了消息对象的复用,减少系统垃圾回收的次数。消息的创建流程如图所示。

2.Handler发送消息

UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,该Looper与UI主线程一一对应。使用ThreadLocal的目的是保证每一个线程只创建唯一一个Looper。之后其他Handler初始化的时候直接获取第一个Handler创建的Looper。Looper初始化的时候会创建一个消息队列MessageQueue。至此,主线程、消息循环、消息队列之间的关系是1:1:1。

Handler、Looper、MessageQueue的初始化流程如图所示:

Hander持有对UI主线程消息队列MessageQueue和消息循环Looper的引用,子线程可以通过Handler将消息发送到UI线程的消息队列MessageQueue中。

3.Handler处理消息

UI主线程通过Looper循环查询消息队列UI_MQ,当发现有消息存在时会将消息从消息队列中取出。首先分析消息,通过消息的参数判断该消息对应的Handler,然后将消息分发到指定的Handler进行处理。

子线程通过Handler、Looper与UI主线程通信的流程如图所示。

更详细请参考:

http://blog.csdn.net/lmj623565791/article/details/38377229

转载于:https://www.cnblogs.com/wanghaoyuhappy/p/5268487.html

[转]Android中handler机制的原理相关推荐

  1. android中handler机制,如何使用?,Android中的Handler机制

    一.Handler概述 二.Handler发送消息的方法 三.MessageQueue的enqueueMessage() 四.Message的when字段 五.子线程中使用Handler 六.Loop ...

  2. Android 为什么要有handler机制?handler机制的原理

    为什么要有handler机制? 在Android的UI开发中,我们经常会使用Handler来控制主UI程序的界面变化.有关Handler的作用,我们总结为:与其他线程协同工作,接收其他线程的消息并通过 ...

  3. Android中handler的使用及原理---学习笔记

    Handler类的基本介绍以及使用: Android中UI操作是线程不安全的操作,如果有多个线程并发操作UI组件,就会出现线程安全问题,所以Android中制定了一个规则:在Android中只允许主线 ...

  4. Android中Handler的使用

    在Android开发中,我们常常会遇到这样一种情况:在UI界面上进行某项操作后要运行一段非常耗时的代码,比方我们在界面上点击了一个"下载"button,那么我们须要运行网络请求,这 ...

  5. Android面试——Handler 机制

    Android面试--Handler 机制 一.Handler机制 Handler机制围绕的三个点 1.Handler负责消息的发送和接受 发送给消息MessageQueue和接受Looper返回的消 ...

  6. 自己写个C++版本Handler来理解Android的Handler机制

    由于日常工作不需要经常写android上层应用,对Android的Handler机制一直处于模模糊糊的状态.使用Handler之后,回去写c++代码时,时刻怀念Android里面的Handler,希望 ...

  7. (转)Android笔记--handler机制

    一.重要参考资料 [参考资料] 目前来看,下面的几个网址中的内容质量比较不错,基本不需要再读别的网址了. 1.android消息机制一 http://xtfncel.javaeye.com/blog/ ...

  8. android scroller,深入理解Android中Scroller的滚动原理

    View的平滑滚动效果 什么是实现View的平滑滚动效果呢,举个简单的例子,一个View从在我们指定的时间内从一个位置滚动到另外一个位置,我们利用Scroller类可以实现匀速滚动,可以先加速后减速, ...

  9. Android中Log机制

    Android中Log机制 写Log过程 首先从Java层入手 下面是定义的Log级别:public static final int VERBOSE = 2;public static final ...

最新文章

  1. react中使用构建缓存_通过构建海滩度假胜地网站,了解如何使用React,Contentful和Netlify...
  2. 如何对自己做好正确的人生规划
  3. 没有运行 spring_Spring事务的传播行为案例分析
  4. linux查看队列 msg,linux第10天 msg消息队列
  5. 全新设计的 Xcode 12
  6. CGAL中Polyhedron_3中与半边结构有关的具体使用
  7. mysql5.7.22的配置说明_mysql 5.7.22 免安裝版Windows配置
  8. 系统自带命令subst.exe创建虚拟软驱
  9. 美团|商家数据指标体系搭建实例 。
  10. word如何自动生成目录
  11. C# 文件复制和移动操作(单个文件)
  12. 商务网站建设与维护【6】
  13. js实现 打开网页自动弹出添加QQ好友邀请窗口、或直接打开聊天窗口
  14. 使用NAudio音频文件剪切指定片段
  15. webpack基础篇(三):管理资源(image、css、fonts、csv、json5)
  16. 双拼和五笔输入法键盘位浮动贴图,适合初学者使用
  17. excel表格拆分怎么做?
  18. Clickhouse 在大数据分析平台 - 留存分析
  19. linux 僵尸进程deffunc,多进程-开启子进程的两种方式,查看进程的pid与ppid,僵尸进程与孤儿进程...
  20. 《人人都是产品经理》读书摘抄(二)

热门文章

  1. Java入门算法(滑动窗口篇)丨蓄力计划
  2. python logging 不输出控制台_python logging日志配置,如何不输出到控制台
  3. 计算机网络电信号误差,用0V~5V方式传输远方温度信号的弊端
  4. 园林计算机制图在计算机上的应用,浅谈计算机园林效果图在园林景观设计中的运用...
  5. python聚类的结果显示_使用Python进行聚类
  6. python 物联网开发板_物联网学什么开发板好?
  7. 四因素三水平正交试验表_测试用例设计方法(二)——正交实验法
  8. php opcodevld,利用PHP扩张vld查看PHP opcode
  9. 干货分享:单片机编程学习攻略!
  10. php提交多条数据,tpphp一个表单提交多个需要循环的数据怎么处理