天天看点

Android性能优化-布局篇

 一.布局优化

   1.app里的每一个view,android系统都会经过三部曲来渲染:measure,layout,draw。measure从最顶部的节点开始,

   顺着layout树形结构依次往下,测量每个view需要在屏幕当中展示的尺寸大小,节点所处位置越深,套嵌带来的measure越多,计算就会越费时

   2.HierarchyViewer和lint工具

      (1)HierarchyViewer

          http://mrpeak.cn/android/2016/01/11/android-performance-ui

      (2)lint的使用:       

         ①作用:找出项目中不规范的编码、多余的资源、可能的bug、可能出现内存泄漏的地方或者其它的一些问题,然后会给出修改的建议供我们参考,

               虽然这些问题并不会影响App的正常运行,不过这对于项目的规范性和维护性来说是非常重要的。

         ②使用:

            Analyze->Inspect Code->选择范围点击OK   

   3.布局优化措施:

      (1)include标签

       优点:重用布局,做代码优化

       缺点:可能会导致产生多余的布局嵌套  

      (2).merge标签

        merge标签是为了解决include标签导致的多余的布局嵌套

        最外层的LinearLayout/RelativeLayout布局删除掉,换用了<merge>标签,这就表示当有任何一个地方去include这个布局时,

       会将<merge>标签内包含的内容直接填充到include的位置,不会再添加任何额外的布局结构

      (3).ViewStub:

         1)对于功能:对于一个布局的一部分,我们需要控制他的隐藏跟显示

          我们一般的做法是设置它为GONE但是将元素进行隐藏,它们其实还是在布局当中的,解析布局的时候还是回将这些布局一一解析出来

          我们使用ViewStub可以实现不常用的元素在需要时被加载,它没有大小,没有绘制功能,也不参与布局,资源消耗非常低,

        将它放置在布局当中基本可以认为是完全不会影响性能的。

         2)ViewStub如何使用?

           把需要被隐藏的布局单独放到一个layout布局文件中,然后用ViewStub标签加载

<ViewStub
            android:id="@+id/viewstub_demo"
            android:layout="@layout/viewstub_test"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/> 
           
//一旦ViewStub中指定的布局加载之后,这个id也就失败了
            //ViewStub只能Inflate一次,之后ViewStub对象会被置为空           
            viewstub_demo= (ViewStub) findViewById(R.id.viewstub_demo);
            public void onClick(View v) {             
               if(viewstub_demo!=null){
                  //使用inflate()方法或者setVisibility(View.VISIBLE)都可以讲布局加载出来
                  View view=viewstub_demo.inflate();
                  EditText et_name= (EditText) view.findViewById(R.id.et_name);
                }
            }
           

            PS:ViewStub所加载的布局是不可以使用<merge>标签的,因此这有可能导致加载出来的布局存在着多余的嵌套结构,具体如何

            去取舍就要根据实际情况来决定了,对于那些隐藏的布局文件结构相当复杂的情况,使用ViewStub还是一种相当不错的选择的

       (4).尽量使用LinearLayout来代替RelativeLayout

            RelativeLayout分别onMeasure()中对所有子View进行两次measure,横向纵向分别进行一次。  

          而LinearLayout只有一次

       (5)减少不必要的infalte

          对于inflate的布局可以直接缓存,用全部变量代替局部变量,避免下次需再次inflate           

       (6)去除不必要的嵌套和View节点,Constraint Layout解决布局嵌套问题

           Constraint Layout的使用:www.jianshu.com/p/a8b49ff64cd3

       (7).Fragment的优化:

         考虑放弃Fragment常驻内存的方案,不使用hide()和show()对Fragment进行控制,改用replace()等方案

继续阅读