走进Java Android 的线程世界(三)Hander消息机制

ActivityThread-->Android的主线程。

走进Java Android 的线程世界(三)Hander消息机制_第1张图片
main方法.png
走进Java Android 的线程世界(三)Hander消息机制_第2张图片
H.png
走进Java Android 的线程世界(三)Hander消息机制_第3张图片
HcodeToString.png
走进Java Android 的线程世界(三)Hander消息机制_第4张图片
HhandleMessage.png

main方法通过Looper获取主线程、结束主线程。
H就是ActivityThread的Handler,主要包含了四大组件的启动和停止等过程。
通过ApplicationThread和AMS进行进程间通信,AMS以进程间通信的方式完成ActivityThread的请求后会回到ApplicationThread中的Binder方法,然后ApplicationThread会向H发送消息,H收到消息后会将ApplicationThread中的逻辑切换到ActivityThread中执行,即切换到主线程中去执行,这个过程就是主线程的消息循环模式。

Looper

走进Java Android 的线程世界(三)Hander消息机制_第5张图片
子线程中用Handler的方法.png
走进Java Android 的线程世界(三)Hander消息机制_第6张图片
prepare.png
走进Java Android 的线程世界(三)Hander消息机制_第7张图片
loop.png
走进Java Android 的线程世界(三)Hander消息机制_第8张图片
quit.png

MessageQueue

next

    Message next() {
        // Return here if the message loop has already quit and been disposed.
        // This can happen if the application tries to restart a looper after quit
        // which is not supported.
        final long ptr = mPtr;
        if (ptr == 0) {
            return null;
        }

        int pendingIdleHandlerCount = -1; // -1 only during first iteration
        int nextPollTimeoutMillis = 0;
        for (;;) {
            if (nextPollTimeoutMillis != 0) {
                Binder.flushPendingCommands();
            }

            nativePollOnce(ptr, nextPollTimeoutMillis);

            synchronized (this) {
                // Try to retrieve the next message.  Return if found.
                final long now = SystemClock.uptimeMillis();
                Message prevMsg = null;
                Message msg = mMessages;
                if (msg != null && msg.target == null) {
                    // Stalled by a barrier.  Find the next asynchronous message in the queue.
                    do {
                        prevMsg = msg;
                        msg = msg.next;
                    } while (msg != null && !msg.isAsynchronous());
                }
                if (msg != null) {
                    if (now < msg.when) {
                        // Next message is not ready.  Set a timeout to wake up when it is ready.
                        nextPollTimeoutMillis = (int) Math.min(msg.when - now, Integer.MAX_VALUE);
                    } else {
                        // Got a message.
                        mBlocked = false;
                        if (prevMsg != null) {
                            prevMsg.next = msg.next;
                        } else {
                            mMessages = msg.next;
                        }
                        msg.next = null;
                        if (DEBUG) Log.v(TAG, "Returning message: " + msg);
                        msg.markInUse();
                        return msg;
                    }
                } else {
                    // No more messages.
                    nextPollTimeoutMillis = -1;
                }

                // Process the quit message now that all pending messages have been handled.
                if (mQuitting) {
                    dispose();
                    return null;
                }

                // If first time idle, then get the number of idlers to run.
                // Idle handles only run if the queue is empty or if the first message
                // in the queue (possibly a barrier) is due to be handled in the future.
                if (pendingIdleHandlerCount < 0
                        && (mMessages == null || now < mMessages.when)) {
                    pendingIdleHandlerCount = mIdleHandlers.size();
                }
                if (pendingIdleHandlerCount <= 0) {
                    // No idle handlers to run.  Loop and wait some more.
                    mBlocked = true;
                    continue;
                }

                if (mPendingIdleHandlers == null) {
                    mPendingIdleHandlers = new IdleHandler[Math.max(pendingIdleHandlerCount, 4)];
                }
                mPendingIdleHandlers = mIdleHandlers.toArray(mPendingIdleHandlers);
            }

            // Run the idle handlers.
            // We only ever reach this code block during the first iteration.
            for (int i = 0; i < pendingIdleHandlerCount; i++) {
                final IdleHandler idler = mPendingIdleHandlers[i];
                mPendingIdleHandlers[i] = null; // release the reference to the handler

                boolean keep = false;
                try {
                    keep = idler.queueIdle();
                } catch (Throwable t) {
                    Log.wtf(TAG, "IdleHandler threw exception", t);
                }

                if (!keep) {
                    synchronized (this) {
                        mIdleHandlers.remove(idler);
                    }
                }
            }

            // Reset the idle handler count to 0 so we do not run them again.
            pendingIdleHandlerCount = 0;

            // While calling an idle handler, a new message could have been delivered
            // so go back and look again for a pending message without waiting.
            nextPollTimeoutMillis = 0;
        }
    }
走进Java Android 的线程世界(三)Hander消息机制_第9张图片
enqueueMessage.png
走进Java Android 的线程世界(三)Hander消息机制_第10张图片
quit.png
走进Java Android 的线程世界(三)Hander消息机制_第11张图片
removeAllFutureMessagesLocked.png

Message

callback.png
走进Java Android 的线程世界(三)Hander消息机制_第12张图片
obtain.png
走进Java Android 的线程世界(三)Hander消息机制_第13张图片
recycle.png
走进Java Android 的线程世界(三)Hander消息机制_第14张图片
recycleUnchecked.png

Handler

走进Java Android 的线程世界(三)Hander消息机制_第15张图片
Handler构造方法.png
走进Java Android 的线程世界(三)Hander消息机制_第16张图片
Callback.png
走进Java Android 的线程世界(三)Hander消息机制_第17张图片
dispatchMessage.png
走进Java Android 的线程世界(三)Hander消息机制_第18张图片
post.png
走进Java Android 的线程世界(三)Hander消息机制_第19张图片
循环.png
走进Java Android 的线程世界(三)Hander消息机制_第20张图片
handleMessage.png
走进Java Android 的线程世界(三)Hander消息机制_第21张图片
send.png
走进Java Android 的线程世界(三)Hander消息机制_第22张图片
sendMessageAtTime.png
enqueueMessage.png

ThreadLocal

走进Java Android 的线程世界(三)Hander消息机制_第23张图片
hash.png
走进Java Android 的线程世界(三)Hander消息机制_第24张图片
set.png
走进Java Android 的线程世界(三)Hander消息机制_第25张图片
initializeValues.png
走进Java Android 的线程世界(三)Hander消息机制_第26张图片
values.png
走进Java Android 的线程世界(三)Hander消息机制_第27张图片
values.put.png

Hander机制

走进Java Android 的线程世界(三)Hander消息机制_第28张图片
总.png

你可能感兴趣的:(走进Java Android 的线程世界(三)Hander消息机制)