Handler与Looper、MessageQueue的关系
1. Handler机制?
只要遵循Android使用handler来更新UI的机制,我们就不用关心多线程的问题,所有的更新UI的操作都是在主线程的消息队列中去轮询处理的。(如图)
2. Handler封装了消息的发送
(1)handler获取一个message
handler.obtainMessage();
obtainMessage()的源码:
public final Message obtainMessage()
{
return Message.obtain(this); //这里this本身就是handler对象
}
Message.obtain()的源码:
public static Message obtain(Handler h) {
Message m = obtain();
m.target = h; //m.target就是Message的目的地,将handler本身赋给它,就说明目的地就是handler本身
return m;
}
3. Looper
(1)Looper作为一个消息封装的载体,包含了一个消息队列messageQueue,所有的Handler发送的消息都经过这个消息队列——要发送的消息会往这个消息队列中插入或移除。
(2)Looper.loop()方法是一个死循环,不断轮询messageQueue,如果有消息存在取出并发送给handler,然后handler处理消息,没有就阻塞
4. Handler
内部会和Looper进行关联,也就是说在Handler内部可以找到Looper,找到了Looper也就找到了MessageQueue。调用handler.sendMessage()就是向消息队列中发送消息;然后Looper轮询MessageQueue,将message发送给Handler本身进行处理。
5. MessageQueue
一个消息队列,可以添加消息,并处理消息
6. 总结:

当我们将Handler在主线程(UI线程)中创建的时候,Handler对象会关联一个Looper对象,这个Looper对象不是我们创建的,是早就由ActivityThread的main线程(ActivityThread的main线程就是负责创建和更新UI和轮询消息的,和我们开发window应用一样,它有个大循环在里面,在这个大循环中,Looper对象会不断的去调用loop()方法进行消息轮询)创建好了的,而这个Looper对象里面就有就有它的MessageQueue对象(其实就是一个以linked list形式保存Message对象的数据结构)。

handler负责发送消息,Looper负责接收Hnandler发送的消息,并直接把消息回传给hanlder自己,由Handler自己在不同的线程中处理消息。MessageQueue是一个存储消息的容器,Looper内部包含了MessageQueue对象的引用,就是通过这个容器,Looper才能完成对消息的轮询(通过loop()方法)。

Handler和Looper和MessageQueue之间的关系:Handler对象中既有Looper对象的引用也有MessageQueue对象的引用,其中MessageQueue是通过它的Looper对象的一个mQueue属性获取的,而Looper的对象是创建Handler的线程创建的(创建Looper对象需要调用它的静态方法prepare()创建,不能直接new出来),Looper的对象是通过当前创建Handler的线程创建的,并且要保证这个线程要去调用Looper对象的loop()方法进行Message的轮询(在loop()内部会调用一些native的方法完成本地的消息轮询),如果要退出轮询,可以调用Looper对象的quit()方法。UI线程(主线程)已经帮我们做好了这一切,所以,如果我们在主线程中创建Handler,那么就是由主线程自动帮我们去轮询我们的MessageQueue,所以我们在子线程中调用Handler对象的post(),sendMessage(),才能在主线程(UI线程)中处理我们的Message,而且才能在主线程(UI线程)中更新我们的UI。

其实post(),postDelayed(), sendMessage(), sendMessageDelayed() 这四个方法本质都是调用的sendMessageAtTime()这个方法,只是post对runnable对象进行了包装,包装成了Message对象,而这个Message对象的callback就是runnable,最后我们在选择Message处理方法的时候,优先看这个Message对象有没有callback对象,如果有,就调用这个callback对象,然后再看整个handler对象有没有callback对象,如果有,就调用这个callback对象的handleMessage()方法处理Message对象,如果没有则调用handler对象本身的handleMessage方法处理Message,所以Message的处理是有优先级的。

Handler与looper、MessageQueue的关系相关推荐

  1. 【Android】Handler 机制 ( Handler | Message | Looper | MessageQueue )

    文章目录 I . Handler 机制简介 II . Handler 机制 Handler Message Looper MessageQueue 四组件对应关系 III . Handler ( 消息 ...

  2. Android Handler处理机制 ( 三 ) ——Handler,Message,Looper,MessageQueue

    在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长时间的任务后做出相应的通知 handler基本使用: 在主线程中,使用handler很简单,new一个Handle ...

  3. 线程间通信: Handler , Looper, MessageQueue, Message (完结)

    概述:    为了 线程间 通信方便, Handler 机制 通过 Handler 和 Looper, MessageQueue, Message 这些 类 之间的协作, 简化 多线程的开发.  线程 ...

  4. 【Android 异步操作】Handler ( 主线程中的 Handler 与 Looper | Handler 原理简介 )

    文章目录 一.主线程中的 Handler 与 Looper 二.Handler 原理简介 一.主线程中的 Handler 与 Looper Android 系统中 , 点击图标启动一个应用进程 , 就 ...

  5. Android中的Handler, Looper, MessageQueue和Thread

    前几天,和同事探讨了一下Android中的消息机制,探究了消息的发送和接收过程以及与线程之间的关系.虽然我们经常使用这些基础的东西,但对于其内部原理的了解,能使我们更加容易.合理地架构系统,并避免一些 ...

  6. android handler、looper、message、messageQueue、

    一:handler,looper,message,messagequeue,thread handler: 消息处理着,负责Message消息的发送(handler.sendMessage(....) ...

  7. 了解Handler,Looper, MessageQueue,Message的工作流程

    Handler的作用 异步通信,消息传递 Handler的基本用法 Handler的用法,示例1.(子线程向主线程发送消息) public class HandlerActivity extends ...

  8. Android中的Handler、Looper和MessageQueue的使用以及原理

    提到Handler大家一定都不陌生,通常我们都是在子线程通过在主线程中创建的Handler对象切换到主线程中去更新View的显示内容,然而很少接触Looper更没有感觉到MessageQueue的存在 ...

  9. Handler、Looper与MessageQueue源码分析

    在Android中可以通过Handler来更新主线程中UI的变化,更新UI只能在主线程中进行更新,而为了让其他线程也能控制UI的变化,Android提供了一种机制Handler.Looper与Mess ...

最新文章

  1. java监控activemq,ActiveMQ与Spring整合-监听消息
  2. 深入 理解 Statement 和 PreparedStatement
  3. C语言 | 基于MPU6050的卡尔曼滤波算法(代码类)
  4. JS破解专题|光汇云油登录算法
  5. 软考考前冲刺第一章计算机硬件基础知识
  6. Nexus搭建Maven私有仓库
  7. java解析上的jar包里的pom_Maven引入本地Jar包并打包进War包中的方法
  8. 基于Session的认证方式_实现授权功能_Spring Security OAuth2.0认证授权---springcloud工作笔记118
  9. Docker cpu memory quota使用说明
  10. 客户端和服务器之间的信息结构,客户端和服务器之间的信息结构
  11. 面向对象分析过程案例实战
  12. 下标要求数组或指针类型_C语言,数组循环哪家好,指针or下标?
  13. java中bitconverter_BitConverter.GetBytes 方法以什么顺序返回字节数组
  14. 74LVC1G3157GW
  15. 第一行代码 第三版 第11章网络技术 11.6.1 Retrofit 应用 报错:android.system.ErrnoException: isConnected failed: ECONNRE
  16. 量子计算机原理 不确定,逃避量子物理学中的不确定性原理
  17. vue使用天气API接口
  18. 3dsmax制作简单小屋
  19. 使用beecloud和easychat 做微信H5 微信公众号支付遇到的坑
  20. 人生苦短,我用 Python,如何学习 Python 网络爬虫?

热门文章

  1. [高通MSM8909][Android7.1]移除电池显示选项
  2. Flutter 开发日记(一)
  3. Shell文件加解密
  4. 通过VB画word表格
  5. CSDN账号被盗,感谢CSDN客服的耐心服务。。。。。。。
  6. Java POI实现Excel文件批量导入(兼容xls,xlsx)
  7. iOS开发 - 微信扫描二维码登录网页的原理
  8. 前端批量打包下载文件
  9. Python turtle 画圣诞树
  10. 苹果手机还原网络设置会怎样_经常埋怨苹果信号不好?原来是忘记开启这5个设置,果粉:学到了...