详解Message,Handler,MessageQueue,Looper的关系

在讲它们之间的关系前先介绍几个相关概念:
一、Message消息

  1、作用:线程间通讯的数据单元,可以封装数据   
  2、创建:调用其静态方法Message.obtain(),直接从内部维护的消息池中获取一个已有的消息。

  3、常见属性:
     int what : 唯一标识此消息
     int arg1,arg2:Message对象可以封装的int型数据
     Object obj:Message对象可以封装的Object型数据

  4、简单介绍源码中相关的属性:
     1)long when :每个消息的内部都记录了自己被何时处理
     2) Handler target:每个消息都能记录被哪个Handler对象处理
     3) Runnable callback:消息可以自己决定自己被如何处理,一般此属性为null
     4) Message next:每个消息的内部都维护了一个消息对象,以此构成一个消息队列
     5)private static Message sPool:要通过obtain()获得的对象

二、Handler处理器  

  1、作用:Handler是Message的处理器,同时也负责消息的发送和移除操作

  2、发送消息

有如下四个方法,见名知意,我就不解释了

  sendEmptyMessage(int what)     

sendEmptyMessageDelayed(int what,long millitime)

 sendMessage(Message mess)    

sendMessageDelayed(Message mess,long millitime)

   
   ps: 延迟消息是立刻发送,延迟处理
   3、分发消息
 
    
 消息的处理方式如上图,有三种,前两种方式优先级较高但是一般为空,通常都是调用handleMessage()处理
   
  4、移除消息
 移除指定id的消息:removeMessages(int what)
 移除所有未被执行的消息:    removeCallbacksAndMessages(null)

三、MessageQueue: 消息队列

  1、用来存放通过Handler发送的消息
  2、它是一个按Message的when排序的优先级队列。(when:代表着被处理的时间)

四、Looper循环器

  1、负责循环取出MessageQueue中当前需要处理的Message
  2、交给对应的Handler处理
  3、处理完后将消息放到消息池中以备复用

接下来就到正题了,看看他们之间是如何协调工作的

 


  1、通过Message.obtain()从消息池中获取一个消息对象,给相关属性赋值(what等)

   2、Handler对象将消息发送出去(延迟消息是立即发送,延迟处理)

   3、发送出去的消息会在MessageQueue里进行排序(按照when属性也就是处理时间排序)

   4、Looper会从MessageQueue里取出消息,可能会出现阻塞(消息队列没有消息或者是最近一个消息还没到处理时间),出现阻塞时,Looper陷入沉睡(不浪费内存),到时间了,他会自己唤醒自己

   5、Looper取出消息后就会调用Handler对象的dispatchMessage()方法分发消息(处理消息的方式有三种:Message的callback(为Runnable对象),Handler的callback,和Handler的handleMessage,前两种方式优先级比较高,但是很少用,一般为null)

   6、Handler对象调用handleMessage方法操作 UI(在主线程)

   7、消息处理完后会从消息队列中移除,Looper会负责将消息清理干净(所有属性回归原值)再放入消息池中以备复用

 8、发送消息和处理消息是同一个对象


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值