你真的懂Android Handler吗?(三)

你真的懂Android Handler吗?(一)你真的懂Android Handler吗?(二)这两篇文章中我们了解了Handler是如何跟线程绑定的,也知道了Handler中消息传递的机制是通过无限for循环。但是我们还遗留了一些问题,比如MessageQueue中的数据结构是怎样的?是一个先进先出的队列吗?在主线程中使用了无限for循环,为什么消息队列为空时没有引起ANR呢?这些问题需要我们通过分析MessageQueue源码来寻找答案。

对于第一个问题,MessageQueue是一个先进先出的队列吗?其实并不是,而是一个Message的单链表,MessageQueue中有一个mMessages属性,它是一个Message类型的对象,它指向了单链表的头。Message类中有一个next属性,它也是Message类型的,它指向一个message的下一个节点。下面是MessageQueue和Message的部分源码:

public final class MessageQueue {
    ......

    //消息队列的头
    Message mMessages;

    //标示next()方法是否被阻塞在pollOnce()处一段时间,具体时间由non-zero-timeout决定
    // Indicates whether next() is blocked waiting in pollOnce() with a non-zero timeout.
    private boolean mBlocked;
    ......
}


public final class Message implements Parcelable {
    
    public int what;

猜你喜欢

转载自blog.csdn.net/kanglupeng/article/details/105764813