Message、Handler、Message Queue、Looper (转 csdn)

  一、几个关键概念

1、MessageQueue:是一种数据结构,见名知义,就是一个消息队列,存放消息的地方。每一个线程最多只可以拥有一个MessageQueue数据结构。
创建一个线程的时候,并不会自动创建其MessageQueue。通常使用一个 Looper 对象对该线程的MessageQueue进行管理。主线程创建时,会创建一
个默认的 Looper 对象,而 Looper 对象的创建,将自动创建一个 Message   Queue 。其他非主线程,不会自动创建 Looper ,要需要的时候,通过调
用prepare函数来实现。

2、 Message :消息对象, Message   Queue 中的存放的对象。一个 Message   Queue 中包含多个 Message
Message 实例对象的取得,通常使用 Message 类里的静态方法obtain(),该方法有多个重载版本可供选择;它的创建并不一定是直接创建一个新的实例,
而是先从 Message   Pool(消息池)中看有没有可用的 Message 实例,存在则直接取出返回这个实例。如果 Message   Pool中没有可用的 Message 实例,
则才用给定的参数创建一个 Message 对象。调用removeMessages()时,将 MessageMessage   Queue 中删除,同时放入到 Message   Pool中。除了上面这
种方式,也可以通过Handler对象的obtainMessage()获取一个 Message 实例。

3、 Looper
是MessageQueue的管理者。每一个MessageQueue都不能脱离 Looper 而存在, Looper 对象的创建是通过prepare函数来实现的。同时每一个 Looper 对象
和一个线程关联。通过调用 Looper .myLooper()可以获得当前线程的 Looper 对象
创建一个 Looper 对象时,会同时创建一个MessageQueue对象。除了主线程有默认的 Looper ,其他线程默认是没有MessageQueue对象的,所以,不能
接受 Message 。如需要接受,自己定义一个 Looper 对象(通过prepare函数),这样该线程就有了自己的 Looper 对象和MessageQueue数据结构了。
Looper 从MessageQueue中取出 Message 然后,交由Handler的handleMessage进行处理。处理完成后,调用 Message .recycle()将其放入 Message Pool中。

4、Handler:
消息的处理者,handler负责将需要传递的信息封装成 Message ,通过调用handler对象的obtainMessage()来实现;
将消息传递给 Looper ,这是通过handler对象的sendMessage()来实现的。继而由 LooperMessage 放入MessageQueue中。
Looper 对象看到MessageQueue中含有 Message ,就将其广播出去。该handler对象收到该消息后,调用相应的handler对象的handleMessage()方法
对其进行处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值