Handler message looper三者间的信息通信

本文详细解析了Android中Handler、Looper和MessageQueue三者之间的通信原理。从Looper.prepare()开始,介绍了消息队列的初始化过程,Looper.loop()方法中如何不断获取并处理消息,以及Handler如何通过dispatchMessage()方法来接收并处理消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[size=large]

Handler message looper三者间的信息通信
三者组成一个异步消息处理线程
在应用时、我们一般常重写handlerMessage方法,来刷新UI或者进行线程间的信息通信。但内部的实现过程我们需要通过查看源代码来了解。分析如下:
线程启动后,先调用Looper中的prepare()方法、方法中判断是否有Looper对象,没有则进行实例化并将其放入Threadlocal中。同时、Looper的构造函数中,实例化一个消息队列MessageQueue,存放信息及等待处理。
然后进入loop方法:获取Threadlocal中的Looper对象,取出消息队列;然后进入死循环:不断从消息队列中取信息,没有消息则线程阻塞、当有消息时调用msg.target.dispatchMessage(msg)方法。这里的msg.target就是Handler对象。
所以、Looper的作用:与当前线程绑定,保证一个线程只会有一个实例;同时一个Looper实例也只有一个MessageQueue。
现在有了MessageQueue 也有了不断取消息的动作。下面看Handler
先看Handler的构造函数:
[/size]



public Handler(Callback callback,Boolean async){
mLooper = Looper.myLooper();
mQueue = mLooper.mQueue;
mCallback = callback;
}

[size=large]

构造函数中,获取了消息队列。然后看它的dispatchMessage方法
[/size]

private void dispatchMessage(Message msg){
msg.target = this;//this 指代Handler
handlerMessage(msg);
}



[size=large]
所以、Handler在获取msg的同时、又将自己本身赋值给msg.target;如果MessageQueue一旦获取到msg;则又会调用handler自己来继续处理。


[/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值