android handler工作原理

作用

便于在子线程中更新主UI线程中的控件
这里涉及到了UI主线程和子线程

UI主线程

它很特别。通常我们会认为UI主线程将页面绘制完成,就结束了。但是它没有。它在一直默默等待着来自用户操作控件发生的事件消息。

  • 这里的事件和其中包含的信息都被封装为一个message,它是Parcelable对象。
  • 主线程不能同时处理所有的事件,这个时候就需要一个存放消息的队列message queue
  • 它里面包含了一个叫looper,用来管理这个消息池子
  • handler在其中负责发送和处理事件
  • 去查看Activity中的源码,会发现它会自己创建一个final类型的handler,还有looper的身影。

looper

  • 这个用来管理messageQueue的,主要的执行方法在looper.loop()方法中。大家都这么说
  • UI主线程会给自己创建一个looper对象。子线程的looper需要手动的创建。
  • 当handler在UI主线程上进行实例化的时候,自动持有主线程的looper。

messageQueue

它叫队列,之前以为它里面会有Array或者List之类的,但是在源码里面没有看到。
它队列的实现,是通过message对象中的属性变量next,来指向下一个message

message

消息对象的实体

handler

它的内部实现包含子线程thread、回调函数callback、成员变量looper
每当handler调用sendMessage()(或者其它类似相关方法)的时候,将会向messageQueue里面添加一个message。添加的时候会去检查该message与队列中已经存在的message的when属性,判断谁在前谁在后
其实,两条线程之间的数据交互,一般采用回调方法。handler的实现原理也是依据如此。

具体的使用方法

  • 在UI主线程中调用没有参数的构造方法创建Handler的时候,使用的looper对象就是主线程的Looper
  • 在子线程中调用没有参数的构造方法创建handler的时候,需要主动创建looper对象:Looper.prepare()方法;不然在运行的时候就会报错说"Can't create handler inside thread that has not called Looper.prepare()"
  • 在子线程中可以将主线程的looper作为构造方法的参数创建handler,就不需要在子线程中创建自己的looper了。这个时候回调方法handleMessage(Message msg)方法将会放在主线程中执行,所以这里面不要放特别耗时的操作。
    Handler mHandler =new Handler(Looper.getMainLooper())
  • 在activity中的handler中含有未执行的delay消息的时候,调用activity.onFinish()方法之后,onDestory()不会立刻被调用。所以一般情况下,在调用onFinish()方法的时候需要清理一下mhandler里面的消息

android handler工作原理的更多相关文章

  1. Android ListView工作原理完全解析,带你从源码的角度彻底理解

    版权声明:本文出自郭霖的博客,转载必须注明出处.   目录(?)[+] Adapter的作用 RecycleBin机制 第一次Layout 第二次Layout 滑动加载更多数据   转载请注明出处:h ...

  2. Android ListView工作原理全然解析,带你从源代码的角度彻底理解

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/44996879 在Android全部经常使用的原生控件其中.使用方法最复杂的应该就是 ...

  3. Android Widget工作原理详解(一) 最全介绍

    转载请标明出处:http://blog.csdn.net/sk719887916/article/details/46853033 ; Widget是安卓的一应用程序组件,学名窗口小部件,它是微型应用 ...

  4. Android ListView工作原理完全解析(转自 郭霖老师博客)

    原文地址:http://blog.csdn.net/guolin_blog/article/details/44996879 在Android所有常用的原生控件当中,用法最复杂的应该就是ListVie ...

  5. [旧][Android] View 工作原理(二)

    备注 原发表于2016.05.27,资料已过时,仅作备份,谨慎参考 前言 本文大量参照<Android 开发艺术探索>及参考资料的内容整合,主要帮助自己理清 View 的工作原理.深入学习 ...

  6. [旧][Android] View 工作原理(一)

    备注 原发表于2016.05.23,资料已过时,仅作备份,谨慎参考 前言 本文参考<Android 开发艺术探索>及网上各种资料进行撰写,目的是为自己理清 Android 中 View 的 ...

  7. android——handler机制原理

    在android版本4.0及之后的版本中多线程有明确的分工,子线程可以写所有耗时的代码(数据库.蓝牙.网络服务),但是绝对不能碰UI,想碰UI跟着主线程走,那么我们如何才能让主线程知道我们要对 UI进 ...

  8. android handler 调用原理

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

  9. 移动端自动化测试之Appium的工作原理学习

    Appium 简介 参考官网文档说明:http://appium.io/docs/en/about-appium/intro/ Appium官方文档上介绍,Appium 是一个自动化测试的开源工具,支 ...

随机推荐

  1. 第七届河南省赛10403: D.山区修路(dp)

    10403: D.山区修路 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 69  Solved: 23 [Submit][Status][Web Bo ...

  2. How draw a stem -and -leaf &amp; box-plot display by R.or Python

    参考: 使用R进行数据可视化套路之-茎叶图.盒形图 step by step R 读取数据 在网上下载的2013全国各省区GDP排名(exl文件) 先 另存为 data.txt(为了方便存到D盘文件夹 ...

  3. 注册表:无法打开 XXX 由于某个错误无法打开该密钥。详细信息:拒绝访问

    错误原因:没有注册表用户权限. 正确添加用户权限的步骤如下:(跟着图片步骤) 右击该项,权限: 选中想要添加为当前所有者的用户后,点击应用.如果没用户显示,可以从“其他用户或组”中添加进来. 权限添加 ...

  4. Construct Binary Tree From Inorder and Preorder/Postorder Traversal

    map<int, int> mapIndex; void mapToIndex(int inorder[], int n) { ; i < n; i++) { mapIndex.in ...

  5. [Swust OJ 589]--吃西瓜(三维矩阵压缩)

    题目链接:http://acm.swust.edu.cn/problem/589/ Time limit(ms): 2000 Memory limit(kb): 65535   Description ...

  6. PHP调试工具 《Kint》

    Kint使用,简单介绍 是一个简单又强大的PHP调试工具. 1.kint 是什么? kint是用绝对易人识辨的方式展示PHP调试的数据. 换句话说,它可以取var_dump(),debug_blick ...

  7. android五种布局模式

    Android布局是应用界面开发的重要一环,在Android中,共有五种布局方式,分别是:LinearLayout (线性布局),FrameLayout(框架布局),AbsoluteLayout(绝对 ...

  8. [转]使用ping钥匙临时开启SSH:22端口,实现远程安全SSH登录管理就这么简单

    原文链接:使用ping钥匙临时开启SSH:22端口,实现远程安全SSH登录管理就这么简单 这个留待后面玩一下,还是有安全隐患,非核心业务 临时用一下可以. 设置防火墙策略时,关于SSH:22访问权限, ...

  9. selenium 学习笔记 ---新手学习记录(7) 问题总结(java)

    1.想要获取固定ul下所有li的个数  如下图: //获取ul下li的个数 List<WebElement> elements = driver.findElement(By.id(&qu ...

  10. (IOS)关于Xcode的架构(Architectures)设置

    首先来了解一下Architectures中几个参数的含义 ARMv6:ARM11内核用于iPhone2G和iPhone3G中的架构 ARMv7:modern ARM内核用于iPhone3GS和iPho ...