最近在阅读Activity启动流程,从ActivityThread的handleLaunchActivity开始阅读。当阅读到ViewRootImpl的performTranversal时,发现View的dispatchAttachToWindow先于View的onMeasure执行,而在dispatchAttachToWindow里面会执行mRunQueue.excuteActions,这些actions就包含View.post(runnable)【如果你想通过View.post来获取View的宽高】,因为在Activity的onCreate里面调用View的post,runnable里面是可以拿到View的宽高的。而onCreate是先于performTranversal执行的,准确的说,performTranversal是在onResume之后执行的(所以在onResume里面也是拿不到View的宽高的)。那么在onCreate里面执行的post,在onMeasure之前,这个runnable就被执行了,为什么还能拿到宽高呢。

因为,这个runnable被执行的动作,其实只是向messageQueue里面添加了一个message。而Android的消息队列是处理完上一个才会执行下一个。而performTranversal这个动作自身就是一个message,所以只有当performTranversal执行完才会处理后面添加的。如下所示,Log打印顺序为:

 first msg start

 first msg end

 second msg

mHandler.post(new Runnable() {

    @Override
    public void run() {
        Log.d(TAG,"first msg start");
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                Log.d(TAG,"second msg");
            }
        });
        try {
            Thread.currentThread().sleep(2000);
            Log.d(TAG,"first msg end");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
});

加载流程图:

android 消息机制队列处理

message添加执行图:

android 消息机制队列处理

相关文章:

  • 2022-12-23
  • 2022-01-12
  • 2021-06-24
  • 2022-02-08
  • 2021-10-11
猜你喜欢
  • 2021-07-14
  • 2021-06-29
  • 2021-12-06
  • 2021-06-03
相关资源
相似解决方案