Andriod中Handler,Looper,MessageQueue的关系

把所有主要的逻辑通过关键代码展示出来:


通常,我们的代码:

Handler mHandler = new Handler(){......}


Handler:

public Handler() {
        ......
        mLooper = Looper.myLooper();
        if (mLooper == null) {
            throw new RuntimeException(
                "Can't create handler inside thread that has not called Looper.prepare()");
        }
        mQueue = mLooper.mQueue;

Looper:

 public static final void prepare() {
        if (sThreadLocal.get() != null) {
            throw new RuntimeException("Only one Looper may be created per thread");
        }
        sThreadLocal.set(new Looper());
    }

    private Looper() {
        mQueue = new MessageQueue();
        mRun = true;
        mThread = Thread.currentThread();
    }



public static final void loop() {
        Looper me = myLooper();
        MessageQueue queue = me.mQueue;
        while (true) {
            Message msg = queue.next(); // might block          
            if (msg != null) {
                if (msg.target == null) {
                    // No target is a magic identifier for the quit message.
                    return;
                }......
                msg.target.dispatchMessage(msg);//target即是handler


MessageQueue:

    final Message next() {
        boolean tryIdle = true;

        while (true) {
            ......
            // Try to retrieve the next message, returning if found.
            synchronized (this) {
                now = SystemClock.uptimeMillis();
                Message msg = pullNextLocked(now);


    final Message pullNextLocked(long now) {
        Message msg = mMessages;
        if (msg != null) {
            if (now >= msg.when) {
                mMessages = msg.next;

Message相当于一个单链表的形式,msg.next来访问下一个节点

你可能感兴趣的:(returning,null,thread)