Looper、Message和Handler的关系

本文详细解析了Android中的Handler、Looper和Message之间的关系。Looper维护了一个MessageQueue,用于存储Message对象,这些Message由Handler创建并通过obtainMessage()获取。Looper的prepare()方法将其与线程绑定,loop()方法则负责处理MessageQueue中的消息。MessageQueue遵循FIFO原则管理Message,而Handler负责发送和处理Message,提供了多种发送方法并将Message插入到MessageQueue。Handler的handleMessage()方法是处理消息的核心,根据优先级调用不同处理方式。
摘要由CSDN通过智能技术生成

Handler、Loop和Message 的关系

三者相互之间的关系:Looper中有一个Message队列,队列里面存储的是一个个待处理的Message;Message 中有一个 Handler,这个 Handler 是用来处理Message的。

Message

Meaasge是Handler接收和处理的消息对象;MessageQueue是消息队列,采用先进先出的方式来管理Message。

Message类分析

<span style="font-size:14px;"><span style="font-size:12px;">public final class Message implements Parcelable {
    // what为用户自定义的消息编码,接收者通过编码来识别信息
    public int what;
    //arg1、arg2用来存放整型数据
    public int arg1;
    public int arg2;
    //obj用来传递任意类型的对象
    public Object obj;
    // replyTo是消息管理器
    public Messenger replyTo;
    ...
    /*package*/ int flags;

    /*package*/ long when;
    
    /*package*/ Bundle data;
    
    /*package*/ Handler target;     
    
    /*package*/ Runnable callback; 
   ...
 }</span>
</span>

Message对象通常不是直接new出来的,一般是通过Handler.obtainMessage() 方法来获得Message对象。

Handler.class中的obtainMessage()源码如下,从全局消息池中返回一个新的消息

<span style="font-size:14px;"><span style="font-size:12px;">public final Message obtainMessage()
    {
        return Message.obtain(this);//调用Message中的 public static Message obtain(Handler)方法
    }</span></span>

Message.class中的obtain()方法

<span style="font-size:14px;"><span style="font-size:12px;">public static Message obtain(Handler h) {//返回一个新的消息实例,并设置target成员变量的值
        Message m = obtain();
        m.target = h;
        return m;
    }

public static Message obtain() {//返回一个新的消息实例,避免使用new关键字直接实例化消息
        synchronized (sPoolSync) {
            if (sPool != null) {
                Message m = sPool;
                sPool = m.next;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值