• Android笔记--View绘制流程源码分析(二)


    Android笔记--View绘制流程源码分析二

    通过上一篇View绘制流程源码分析一可以知晓整个绘制流程之前,在activity启动过程中:

    Window的建立(activit.attach生成),DecorView的建立(phonewindow.setContentView生成),
    两者利用ViewRootImpl(WindowManagerGlobal.addView生成)建立window和decorview的联系。
    并在root.setView(view, wparams, panelParentView)中把viewrootimpl(其本身也是一个viewparent)
    作为参数传给decorview.从而让decorview一脉的所有view受viewRootImpl管理绘制。

    在知道了上述Window DecorView WindowManager ViewRootImpl的来龙去脉以后就可以继续分析View
    绘制的流程。

    那么到底是谁触发了绘制呢?从源码中可以找到如下静态内部类:

     static class W extends IWindow.Stub {
    

    这个类就是负责处理来自系统进程的调用处理工作。在WMS中会触发相应的方法。而W中真正执行处理的
    是ViewRootImpl。可以看一个其中的例子:
    static class W extends IWindow.Stub {
    。。。省略

        @Override
                public void dispatchAppVisibility(boolean visible) {
                    final ViewRootImpl viewAncestor = mViewAncestor.get();
                    if (viewAncestor != null) {
                        viewAncestor.dispatchAppVisibility(visible);
                    }
                }
        。。。省略
    }
    

    W是在ViewRootImpl的构造函数中初始化的:

    public ViewRootImpl(Context context, Display display) {
            。。。省略
            mWindow = new W(this);
    }
    

    所以这里的ViewRootImpl就是W中的ViewRootImpl对象。

    从而系统进程远程触发绘制的流程:

    viewAncestor.dispatchAppVisibility(visible);
    

    这个就是ViewRootImpl的方法。最终会调用如下方法:

    ViewRootImpl.java

    public void dispatchAppVisibility(boolean visible) {
            Message msg = mHandler.obtainMessage(MSG_DISPATCH_APP_VISIBILITY);
            msg.arg1 = visible ? 1 : 0;
            mHandler.sendMessage(msg);
        }
    //通过handler进行消息传递
    
    void handleAppVisibility(boolean visible) {
            if (mAppVisible != visible) {
                mAppVisible = visible;
                scheduleTraversals();
                。。。省略
            }
        }
    

    scheduleTraversals方法就是开始进行view绘制的入口方法

     void scheduleTraversals() {
            if (!mTraversalScheduled) {
                mTraversalScheduled = true;
                mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();
                mChoreographer.postCallback(
                        Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
                //这里的mTraversalRunnable就是一个runnable接口。其run方法内部是view绘制的全过程
                 
                。。。省略
            }
        }
        
        
     void doTraversal() {
             if (mTraversalScheduled) {
                 。。。省略
                 
                 performTraversals();
     
                 。。。。省略
             }
         }
    

    执行到此为止performTraversals方法就是众所周知的真 | View绘制流程!

  • 相关阅读:
    mysql 版本查看
    js 中文乱码
    浏览器内核
    Squid 代理服务器
    minicygwin
    firefox 插件开发
    ocx c++
    NetBeans
    android 虚拟机
    ExpandableListView
  • 原文地址:https://www.cnblogs.com/zharma/p/8428217.html
Copyright © 2020-2023  润新知