作家
登录

用两张图告诉你,为什么你的App会卡顿?

作者: 来源: 2017-06-01 08:56:06 阅读 我要评论

  •     boolean clearHide, boolean isForward, boolean reallyResume, int seq, String reason) { 
  •     ... 
  •     ViewManager wm = a.getWindowManager(); 
  •     //获得WindowManager,实际是WindowManagerImpl 
  •     ... 
  •     wm.addView(decor, l); 
  •     //添加视图 
  •     ... 
  •     wm.updateViewLayout(decor, l); 
  •     //须要刷新的时刻会走这里 
  •     ... 
  •  
  • 大年夜膳绫擎可以看到,当Activity履行onResume()的时刻就会添加视图,或者刷新视图。须要解释一点:WindowManager实现了ViewManager接口。

    如图中所说,WindowManagerGlobal调用addView()的时刻会把DecorView添加到它保护的数组中去,并且会创建另一个关键且极其重要的ViewRootImpl(这个必须要专门讲一下)类型的对象,并且也会把它存到一个数组中保护。

    1. public void addView(View view, ViewGroup.LayoutParams params, 
    2.     Display display, Window parentWindow) { 
    3.     ... 
    4.     root = new ViewRootImpl(view.getContext(), display); 
    5.     //重要角色登场 
    6.     view.setLayoutParams(wparams); 
    7.     mViews.add(view); 
    8.     mRoots.add(root); 
    9.     //保存起来保护 
    10.     mParams.add(wparams); 
    11.     ... 
    12.     root.setView(view, wparams, panelParentView); 
    13.     //设置须要属性view是DecorView,panelParentView是PhoneWindow 
    14.     ... 
    15.  

    可以看出ViewRootImpl是在Activity履行onResume()的时刻才被创建的,并且此时才把DecorView传进去让它治理。

    常识点:WindowManager是在onCreate()时被创建。它对窗口的治理才能实际是经由过程WindowManagerGlobal实现的。在onResume()是视图才经由过程WindowManager被添加到窗口上。

    ViewRootImpl可以或许和体系的WindowManagerService进行交互,并且治理着DecorView的绘制和窗口状况。异常的重要。赶紧在图中找到对应地位吧!

    ViewRootImpl并不是一个View,而是负责治理视图的。它合营体系来完查对一个Window内的视图树的治理。大年夜图中也可以看到,它持有了DecorView的引用,并且视图树它是视图树绘制的起点。是以,ViewRootImpl会稍微复杂一点,须要我们更深刻的去懂得,在图中我标出了它比较重要的构成Surface和Choreographer等都邑在后面提到。

    到此,我们已经一路把第一张图撸了一遍了,如今童鞋们因该对Android视图框架有了大年夜致的懂得。下面将更进一步的去懂得Android的绘制机制。

    App老是卡顿到底是什么原因?

    下面将会具体的讲解为什愦我们设置的视图可以或许被绘制到屏幕上?这中心毕竟隐蔽着如何的瑰异?看完之后,你天然就可以或许大年夜根源知道为什么你的App会那么卡,以及开端有思路着手解决这些卡顿。

    Window大年夜字面看它是一个窗口,意思和PC上的窗口概念有点像。但也不是那么精确。看图说。可以看到,我们要显示的构造是被放到它的属性mDecor中的,这个mDecor就是DecorView的一个实例。下面会专门撸DecorView,如今先把存眷点放到Window上。Window还有一个比较重要的属性mWindowManager,它是WindowManager(这是个接口)的一个实现类的一个实例。我们日常平凡经由过程getWindowManager()办法获得的器械就是这个mWindowManager。顾名思义,它是Window的治理者,负责治理着窗口及个中显示的内容。它的实际实现类是WindowManagerImpl。可能童鞋们如今正在PhoneWindow中寻找着这个mWindowManager是在哪诚实例化的,是不是高低往返滚动着这个类都找不见?STOP!mWindowManager是在它爹那边就实例化好的。下面代码是在Window.java中的。


      推荐阅读

      换个角度看看,为什么钓鱼攻击总能成功?

    当我第一次收到银行发来的“安然”邮件时,我第一反竽暌功就是这里是否有诈?因为在我看来,它实袈溱是太像垂纶邮件了。这封躺在收件箱里的邮件来源竽暌冠我银行经理的小我邮箱地>>>详细阅读


    本文标题:用两张图告诉你,为什么你的App会卡顿?

    地址:http://www.17bianji.com/lsqh/35508.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)