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. 史上最简单的Hibernate入门简单介绍

    事实上Hibernate本身是个独立的框架,它不须要不论什么web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了非常多非Hibernate ...

  2. jquery 插件 validate 学习

    jquery是十分方便的对于现在来说. 首先应该明白一个问题: <p> <label  for="password">Password</label& ...

  3. JavaMail收发邮件的一般流程与主要方法

    1.Properties属性类 Properties p = new Properties(); p.put(key, value); key -| mail.smtp.host -| mail.sm ...

  4. handlebar.js使用

    官方网站:http://handlebarsjs.com/ 下载及查看使用帮助,或者用百度cdn引用 一.定义模板 <script id="entry-template" t ...

  5. solr6环境搭建

    1.下载并安装jdk1.8,配置环境变量 2.下载并安装tomcat8(8以上) 3.下载solr源码,转变部署solr a)[solr-6.2.0\server\solr-webapp]下的weba ...

  6. Volley 设置 RetryPolicy 不起作用, 重复提交

    RT, Google后有的说是 将超时时间设置为0, 但是还是会重试提交, 解决方案如下: static HurlStack stack = new HurlStack(){ @Override pr ...

  7. IOS 学习笔记(6) 控件 文本域(UITextField)的使用方法

    UITextField控件的诸多特性都和UITextView相似,比如成为输入文本焦点时键盘自动显示,支持长按弹出动作选项,能够接收输入事件(开始输入,修改内容,结束输入和点击回车等). 1.特有的特 ...

  8. oracle10g安装图解(win7)

    一.Oracle10g 安装预备步骤取得 Oracle 10g 安装程序,或从 Oracle 技术网(OTN)下载光盘映像.在评估阶段您可以免费下载和使用无技术限制的全功能 Oracle,但在正式的商 ...

  9. linux下笔记本有线网卡"未受管理"

    前段时间因为在弄一个笔记双网卡共享上网的事情把笔记本的有线网卡弄环了,连接的时候一直出现如下情况: 1)有线网卡:未受管理 2)无线网卡:每次登录的时候必须把原来登录过的信息删除掉,然后重新输入密码, ...

  10. 为什么webview.loadUrl("javascript:function() ")不执行?

    这几天搞webview 但是常常有时候会出现webview.loadurl 没有反映的情况对现在的分析如下: 情况一:webview.loadurl 的加载是在另一个线程中执行必须要在webview加 ...