美文网首页
Android Handler.post()

Android Handler.post()

作者: 折剑游侠 | 来源:发表于2020-01-15 14:37 被阅读0次

    前面分析过handler相关的类handler源码分析,post方法实际上也是发送message,下面看看源码实现。

    Handler.post()

    public final boolean post(Runnable r){
            return sendMessageDelayed(getPostMessage(r), 0);
        }
    
    public final boolean postDelayed(Runnable r, long delayMillis){
            return sendMessageDelayed(getPostMessage(r), delayMillis);
        }
    //将传过来的Runnable赋值给message.callback,
    //实际上就是发送一个带有Runnable的消息。
    private static Message getPostMessage(Runnable r) {
            Message m = Message.obtain();
            m.callback = r;
            return m;
        }
    

    两个方法都调用sendMessageDelayed()

    public final boolean sendMessageDelayed(Message msg, long delayMillis)
        {
            if (delayMillis < 0) {
                delayMillis = 0;
            }
            return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
        }
    

    继续跟

    public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
            MessageQueue queue = mQueue;
            if (queue == null) {
                RuntimeException e = new RuntimeException(
                        this + " sendMessageAtTime() called with no mQueue");
                Log.w("Looper", e.getMessage(), e);
                return false;
            }
            return enqueueMessage(queue, msg, uptimeMillis);
        }
    

    接下来就是MessageQueue.enqueueMessage(),前面分析过发送message流程,这里不细说。最终Looper获取到消息调用Handler.dispatchMessage()完成回调。

    Handler.dispatchMessage()

    public void dispatchMessage(Message msg) {
            if (msg.callback != null) {
                handleCallback(msg);
            } else {
                if (mCallback != null) {
                    if (mCallback.handleMessage(msg)) {
                        return;
                    }
                }
                handleMessage(msg);
            }
        }
    

    msg.callback不为空,会走handleCallback(msg)

    private static void handleCallback(Message message) {
            message.callback.run();
        }
    

    handler接收到消息后回调Runnable.run()。也就是说通过主线程初始化的handler,调用post()发送消息,Runnable.run()最终会回调在主线程。

    子线程中经常会用runOnUiThread()更新ui,Activity.runOnUiThread()。

        final Handler mHandler = new Handler();
        ...
        public final void runOnUiThread(Runnable action) {
            if (Thread.currentThread() != mUiThread) {
                mHandler.post(action);
            } else {
                action.run();
            }
        }
    

    mHandler是activity的成员变量,初始化在ui线程。runOnUiThread()也是调用Handler.post()发送带有Runnable的消息切换到ui线程。

    相关文章

      网友评论

          本文标题:Android Handler.post()

          本文链接:https://www.haomeiwen.com/subject/imjtzctx.html