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()等方案
       
         
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值