Android高级进阶

2019-08-10-Handler机制之Message介绍

2019-08-10  本文已影响0人  王元

Handler机制之Message介绍

提到handler消息机制,必然少不了要介绍Handler中最重要的消息载体Message

1,Message可以携带的信息

2,Message消息的实现方式

    public static final Object sPoolSync = new Object();
    private static Message sPool;       
    public static Message obtain() {
        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();
    }

从上方我们可以看出,

3,Handler消息池的实现原理

private static final Object sPoolSync = new Object();//控制获取从消息池中获取消息。保证线程安全
private static Message sPool;//消息池
private static int sPoolSize = 0;//消息池中回收的消息数量
private static final int MAX_POOL_SIZE = 50;//消息池最大容量

从Message的消息池设计,我们大概能看出以下几点:

4,回收消息池

void recycleUnchecked() {
    //用于表示当前Message消息已经被使用过了
    //清除之前Message的数据
    flags = FLAG_IN_USE;
    what = 0;
    arg1 = 0;
    arg2 = 0;
    obj = null;
    replyTo = null;
    sendingUid = -1;
    when = 0;
    target = null;
    callback = null;
    data = null;

    synchronized (sPoolSync) {
        //判断当前消息池中的数量是不是小于最大数量,其中 MAX_POOL_SIZE=50
        if (sPoolSize < MAX_POOL_SIZE) {
            next = sPool;
            sPool = this;
            //增加线程池数量
            sPoolSize++;
        }
    }
}

5,Handler的消息回收机制

虽然Handler.remove消息的方式很多,但是最终都是使用了MessageQueue的移除消息方式

public final void removeCallbacksAndMessages(Object token) {
    mQueue.removeCallbacksAndMessages(this, token);
}

接下来我们看下mQueue.removeCallbacksAndMessages的实现

void removeCallbacksAndMessages(Handler h, Object object) {
    if (h == null) {
        return;
    }

    synchronized (this) {
        Message p = mMessages;

        // Remove all messages at front.
        while (p != null && p.target == h
                && (object == null || p.obj == object)) {
            Message n = p.next;
            mMessages = n;
            p.recycleUnchecked();
            p = n;
        }

        // Remove all messages after front.
        while (p != null) {
            Message n = p.next;
            if (n != null) {
                if (n.target == h && (object == null || n.obj == object)) {
                    Message nn = n.next;
                    n.recycleUnchecked();
                    p.next = nn;
                    continue;
                }
            }
            p = n;
        }
    }
}

从上面我们可以看到,Handler是使用了俩次循环从消息链表中移除消息的

至于为什么会要俩次循环移除消息呢?

6,总结

Message及Message回收机制

上一篇 下一篇

猜你喜欢

热点阅读