Android13 Handler post流程分析

Handler的post方法是将一个Runnable对象投递到与此Handler关联的消息队列中,代码如下:

//freameworks/base/core/java/android/os/Handler.java
public class Handler {
    public final boolean post(@NonNull Runnable r) {
       return  sendMessageDelayed(getPostMessage(r), 0);
    }
}

上面的主要处理如下:

1、调用Handler的getPostMessage方法,通过Runnable获取对应的Message。

2、调用Handler的sendMessageDelayed方法,发送这个Message。

下面分别进行分析:

Handler的getPostMessage

通过getPostMessage取得Runnable 对应的Message :

//freameworks/base/core/java/android/os/Handler.java
public class Handler {
    private static Message getPostMessage(Runnable r) {
        Message m = Message.obtain();
        m.callback = r;
        return m;
    }
}

调用Message的obtain方法获取一个Message对象:

//freameworks/base/core/java/android/os/Message.java
public final class Message implements Parcelable {}
    private static Message sPool;
    private static int sPoolSize = 0;
    public static Message obtain() { //从全局的Message池中获取一个Message对象,如果池中没有可用的对象,则新建一个Message对象
        synchronized (sPoolSync) {
            if (sPool != null) { 
                Message m = sPool;
                sPool = m.next;
                m.next = null;
                m.flags = 0; // clear in-use flag
                sPoolSize--;
                return m;
            }
        }
        return new Message();
    }
}

new Message

创建Message对象,Message的构造方法如下:

//freameworks/base/core/java/android/os/Message.java
public final class Message implements Parcelable {
    public Message() {
    }
}

1、Message类持有一个sPool静态变量,它永远指向一个单链表的头引用,该sPool组成的单链表用于在内存中缓存使用过的Message对象,可以节省内存空间、可以节省创建对象的开销(这要单独开一篇源码分析文章)

2、所有需要传入参数的静态方法obtain()的内部均调用了无参数的静态方法obtain(),无参数的静态方法obtain()会从Message消息池中取出一个Message对象

3、不要使用new的方式创建Message对象,因为系统帮我们缓存了一批Message对象!(内存缓存)

Handler sendMessageDelayed

这部分与Handler的sendMessage流程一致

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值