Android开发中的性能优化---布局

Posted 予有荣焉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android开发中的性能优化---布局相关的知识,希望对你有一定的参考价值。

1.基础

  android中所有的View都是“画”在手机屏幕上的,系统是每隔16ms更新一次Activity中的内容,所以为了让用户看不到卡顿,就要想尽一切方法来让界面在16ms内更改完成,遵循的原则其实只有一个-----尽量的少画东西,这样效率当然就会提高,至于什么减少布局层次,避免重复绘制,总结下来还是尽量少画东西。 
   
  为什么是16ms?因为现在市面上的手机一般都是60hz的,所以 16ms/ 帧 ≈ 1s / 60hz

 

2.方法

  使用手机中的开发人员工具--->调试GPU过度绘制,使用这个工具来检测布局层次再好不过 
技术分享图片 
  颜色当然是越浅越好,能显示出View的自己的颜色,那么是最理想的状况 
   
  

2.1 window的background

  window的background属性,是在每个主题中默认就有的,但是在实际开发中,基本上每个界面的背景色都是特别设置的,并且都会覆盖整个屏幕,所以还不如直接取消掉它 
  另外,这也是解决app冷启动缓慢的一种不错方式,最早的办法是将窗体背景设置为了透明,也就是当用户点击app时,由于窗体背景是透明的,就会将启动的缓慢给归咎于Android系统,这让Android系统无缘无故背了很多黑锅,现在解决冷启动的最好方法就是设置一张图片,就像正常的启动页一样,这样就给用户了一种视觉上秒开的错觉。 
   
  Ps: 
    虽然Android是比较慢,但你拿个一两千的手机和人家ios五六千的比?搞笑 
  技术分享图片 
  

2.2 选择最佳的布局方式

  Android虽然有5大常用布局(Google后续又添加了GridLayoutFlexboxLayoutPercentRelativeLayout等),但最为常用的莫过于LinearLayoutRelativeLayout 
  每一个ViewGrounp基本都会在onMeasure方法中测量出子View的大小,一般情况下LinearLayout的测量效率会高于RelativeLayout,因为LinearLayout的测量次数少,而由于RelativeLayout布局的相对性,所以它的测量次数比较多,毕竟有一种可能是viewA 在横向上依赖于viewB,而viewB在纵向上依赖于viewA 
  技术分享图片
   
  所以,在一般情况下,最好使用LinearLayout 
  既然有一般情况,那么就有二般的情况@[email protected]!,就是LinearLayout布局中使用weight权重来进行布局,这样会增加LinearLayout的测量次数,让它和RelativeLayout处于同一起跑线上,但是众所周知的是,很多时候都需要用到weight属性来进行万恶的屏幕适配,那么问题来了,到底怎么选择? 
  我个人衡量标准: 
  1.当包括父View在内有3层嵌套的情况下,就会考虑RelativeLayout,当不包括父View就嵌套了3层的情况下,我肯定会优先选择RelativeLayout。 
  2.对于不是简单到极致的ListViewRecyclerView,我基本上会选择RelativeLayout来一层解决。 
  

2.3 去掉完全不可能使用的属性资源

  开发时候通常在布局时,就会给View设置一些数据来进行布局参考,比如说为text设置一些文字、给srcbackground设置一些资源或图片(特别是图片),但当程序运行后,这些东西99%不会用到,但是Android系统仍然会傻乎乎的加载这些东西,所以,就不要布局中为这些属性赋值 
  技术分享图片
   
  但是有个问题, 
    如果不赋值,很多人写布局没有了数据参考会很不习惯,比如设置文字的大小,如果赋值就会影响效率,总不能运行时再一个个删除,这样万一运行后效果不理想就还要再一个个加上去, 
    所以google为此提供了tools,在该命名空间下的属性,只会在布局页面中显示,而不会在程序运行时加载 
  技术分享图片
   
  还有一种情况是去掉完全被遮挡的属性,比如下面这张图片中的ImageView的图片遮挡住了LinearLayout的部分背景色,这种情况就不要给布局设置整体背景色了,单独设置给ListView或者它的item即可(不要以为看不到Android就不会画,Android如果有这么聪明,还要程序员干嘛?) 
  技术分享图片
  

2.4 Margin和Padding

  这部分属于个人猜想,paddingmargin在有时候的效果是一模一样的,但是哪个效率更高?我觉得是padding,因为‘margin‘的属性全名是layout_margin,是由父View来决定,这样是不是会影响父View测量子View的速度? 
































以上是关于Android开发中的性能优化---布局的主要内容,如果未能解决你的问题,请参考以下文章

Android性能优化:这是一份详细的布局优化指南(含标签IncludeViewstubMerge讲解)

Android性能优化总结

android开发之merge结合include优化布局

Android面试Android中的性能优化

Android开发学习之路--性能优化之常用工具

布局性能优化:安卓开发者不可错过的性能优化技巧