简单的说,Handler获取当前线程中的looper对象,looper用来存放从MessageQueue中取出的Message,再由Handler进行Message分发和处理,按照先进先出执行。

  MessageQueue(消息队列):用来存放通过Handler发送的消息,通常附属于某一个创建它的线程,可以通过Looper.myQueue()得到当前线程的消息队列。

  Handler:是Message的主要处理者,负责Message的发送,Message内容的执行处理。例如将消息发送到消息队列(sendMessage),更新UI组件(实现该类的handleMessage方法)

  Looper:是Handler和消息队列之间的通讯桥梁,程序组件首先通过Handler把消息传递给Looper,Looper把消息放到队列。Looper也把消息队列里的消息广播给所有的Looper。

  Message:消息的类型,理解为线程间交流的信息,处理数据后台线程需要更新UI,在Handler类中的handleMessage方法中得到单个的消息进行处理。

  Handler机制的大致流程:

  1.在Looper.loop()方法运行开始后,循环的按照接收顺序取出MessageQueue里面的非NULL的Message。

  2.一开始MessageQueue里面的Message都是NULL的,当Handler.sendMessage(Message)到MessageQueue,该函数里面设置了那个Message对象的target属性是当前Handler对象。随后Looper取出了那个Message,则调用该Message的target指向的Handler的dispatchMessage函数对Message进行处理。在dispatchMessage方法里,如何处理Message则由用户指定,三个判断,优先级从高到低:

  1)Message里面的Callback,一个实现了Runnable接口的对象,其中run函数做处理工作

  2)Handler里面的mCallback指向的一个实现了Callback接口的对象,由其handleMessage进行处理。

  3)处理消息Handler对象对应的类继承并实现了其中handleMessage函数,通过这个实现的handleMessage函数处理消息。

  4)Handler处理完该Message后,Looper则设置该Message为NULL,以便回收。

最新文章

  1. jmeter(八)断言
  2. nav布局 在线演示 DIVCSS5
  3. MVC6的内置ActionResult类型
  4. [C/C++][文件操作] 对比目录并列出同名较新文件、较旧文件 0.1
  5. window+git+AndroidStudio+github
  6. 人工智能起步-反向回馈神经网路算法(BP算法)
  7. 253. Meeting Rooms II
  8. Oracle官网下载地址大全(包括11g、10g和9i)
  9. 理解JavaScript中作用域链的关系
  10. HDU 5256 - 序列变换 ,树状数组+离散化 ,二分法
  11. select * from (select P.*,ROWNUM RN FROM(select * from Mp_Relatedart where pubbaseid=785 order by ID ASC )P)M WHERE M.RN>2 and M.RN <= 7
  12. Android中使用"running services"查看service进程内存
  13. 从web图片裁剪出发:了解H5中的Blob
  14. 跟我一起读postgresql源码(九)——Executor(查询执行模块之——Scan节点(上))
  15. 【一天一道LeetCode】#258. Add Digits
  16. git基本概念
  17. jsp篇 之 Jsp中的内置对象和范围对象
  18. 【安全测试自学】初探web安全处测试(二)
  19. Python数据分析与挖掘常用模块
  20. BZOJ.1901.Dynamic Rankings(整体二分)

热门文章

  1. Python - Django - 页面上展示固定的页码数
  2. Eclipse JEE 2018.12R TUNA源直接下载地址
  3. MYSQL:基础——索引原理及慢查询优化
  4. 第5课.linux进阶命令
  5. centos7 install docker
  6. HTTP_HOST , SERVER_NAME 区别
  7. .NET Core IOC AOP
  8. java war包 远程debug出现的问题解决,学会查看日志
  9. Reids原理之IO模型
  10. linux环境下编写shell脚本实现启动停止tomcat服务