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. Java图形化界面设计——布局管理器之null布局(空布局)

    一般容器都有默认布局方式,但是有时候需要精确指定各个组建的大小和位置,就需要用到空布局. 操作方法: 1)       首先利用setLayout(null)语句将容器的布局设置为null布局(空布局 ...

  2. Android导航栏ActionBar的具体分析

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/39378825 关于ActionBar,相信大家并不陌生,可是真正能够熟练使用的也不是许多,这 ...

  3. 3. 表单输入框 在 IE 中 会有 “X” 和 类似wifi图标的图标出现

    原因: IE 自动给 input加了伪类 ::ms-clear 和 ::ms-reveal 解决: input::ms-clear, input::ms-reveal { display: none; ...

  4. VS的工程宏,比如$(SolutionDir) 的含义及查找

    Configuration->General->Output Directory->单击编辑框点下拉箭头-> <Edit...> 图1 图2

  5. [Swust OJ 360]--加分二叉树(区间dp)

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

  6. Problem B: Excuses, Excuses!

    Description Judge Ito is having a problem with people subpoenaed for jury duty giving rather lame ex ...

  7. CDH 无法查看history log

    1.配置(core-site.xml) <property>  <name>hadoop.http.staticuser.user</name>  <valu ...

  8. java 类排序

    参考文档:Java排序: Comparator vs Comparable 入门 java类经常面临排序问题,据我所知:java提供comparable和comparator两种比较方式: 1. co ...

  9. wireshark 包分析命令

    1.查看原地址过滤包命令: ip.src ==192.168.1.1 2.查看目的地址过滤包:ip.dst == 192.168.1.1 3.关键字 eq 等于 "==" ,and ...

  10. widget intent重复问题

    今天在做android widget时发现点击任意widget时只会更新最后一个widget 原来是requestCode的问题 Intent intent = new Intent(WidgetPr ...