Android性能优化总结一:UI布局优化

照例先贴参考文章地址,汲取各方面资源起码要标明一下,可能看的文章较多有遗漏的不断补充完善

https://my.oschina.net/nicksong/blog/3043796

https://www.jianshu.com/p/d71b51a0e29f

Android的性能优化决定了应用的竞争力和性价比,同样的一个应用除了功能和面向的市场、用户不同可能有量化级的差别,但是作为一个写程序的,抛开公司产品的市场和其他,更值得我们关注的应该是开发应用的性能问题,所以自己也总结归纳一下自己学习的相关方面内容,以备记忆和查阅

一:Android界面绘制UI渲染性能优化

Android的渲染机制是经历了测量(onMeasure )布局(onLayout )绘制(onDraw)在绘制在应用界面层,在这里需要知道Android正常的绘制间隔是60帧每秒,也就是说大概在16ms左右会刷新绘制,也只有在这个<=16毫秒的区间内,才能让用户人眼感觉不到卡顿和绘制不流畅的视觉。Android系统每隔16ms发出VSYNC信号触发UI渲染,如果界面绘制无法正常完成控制在这个时间区域内,会发生丢帧、卡顿,在上边说到的三个方法onMeasure、onLayout、onDraw中消耗的时间太长,就容易造成这种现象,所以为了更好更快的绘制UI界面:

1、当布局可以用FrameLayout完成的时候,尽可能用FrameLayout完成。这里借用文章(https://www.cnblogs.com/andy-songwei/p/10955062.html)中的视图层次结构简介来做一个关于系统View的说明,我们平时Activity中setContentView(...)中对应的layout内容对应图中的ViewGroup树状结构,实际在添加到系统中的时候,还会再裹上一层FrameLayout。

关于Android性能优化总结

补充这个的本意与性能优化的主题无关,但是想说明的是,官方的建议也是尽可能使用FrameLayout布局,原因是因为他的绘制流程相对简洁,通俗的讲就是因为FrameLayout布局的界面执行上边的三个方法的次数少。而相对的LinearLayout会进行测量绘制一次,RelativeLayout则会测量两次,为了确定布局下各控件位置,不过LinearLayout如果添加了权重属性,则同样需要测量两次,所以根据最简原则来选择自己应用界面的布局相对较好。另外ConstraintLayout 约束性布局的出现,也更好的完善了布局界面的主体,如果可以的话最好使用ConstraintLayout ,可以有效的较少绘制的流程步骤。关于ConstraintLayout 约束性,大概总结其特性,就是某个控件相对另一个控件的位置,例如app:layout_constraintRight_toRightOf表示控件的constraintRight右边在toRightOf谁的右边,这个谁可以是一个ID对应的其他控件,也可以是parent父布局,也就是整个外围的框子。另外还有一些其他属性之类或者详解,可以参考:https://blog.csdn.net/airsaid/article/details/79052011,在这里就不细说

2、除了从布局搭建的建议上去做性能优化,多使用include标签,增加重复布局的复用性,类似做一个登录界面,忘记密码界面或者注册界面,大体上一样的UI都可以考虑使用include增加复用性,通常在使用include的时候,会配合merge标签使用(https://www.jianshu.com/p/fbcc6a17d11e

使用前:

关于Android性能优化总结

使用后:

关于Android性能优化总结

这里参考我找了好几个文章找到的一个相对好理解的图,可以看到在使用了merge标签之后,很明显系统在绘制这布局层的时候少绘制了一个节点,从性能上来讲,他是变得简洁了,更优化了绘制的流程,所以但凡对性能优化有帮助的方法,我们总归是能用则用,不过关于merge的用法,需要自行查找相关的知识

3、使用ViewStub提高显示速度,使用的好处是在布局加载的时候才会占用,不加载的时候会隐藏。通俗的来讲就是不显示给用户看的时候,其他是不去绘制的,只有当用户需要看到这个界面的时候才会去花时间绘制,这样可以减少不必要的绘制过程,用户没打算看到的界面就不会预先绘制加载在那里,优化显示的速度,另外我们在使用控件的visibility属性的时候,尽量用gone不用invisible,因为gone是隐藏不绘制,invisible则是绘制好占着那里的位置,但是不显示。

4、类似布局中子布局和父布局同一个背景色或者,可以减少不必要的属性标签,TextView等控件定义的text属性等需要则加,不需要则尽量不用,能省则省,省着省着性能就上去了,积少成多嘛

5、关于应用冷启动优化,Android应用在启动的时候,会有冷启动、热启动和温启动的区分:

1、冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。2、热启动:当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。

Android冷启动时会默认有一个白屏加载过渡的过程,也可以设置为黑屏或者透明屏

 <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">         <item name="android:windowBackground">@drawable/img_splash</item>

  </style>

黑屏和白屏效果不太好看,透明屏则会有明显的启动慢的错觉效果,所以建议是使用上述style来优化启动界面的过渡效果,定义一张启动界面图,最好和启动界面的背景一致,可以无感过渡,让用户视觉体验更流程

另外关于这个启动过渡界面的时长,主要是受到Application中启动项的影响,如果在Application中过多的初始化一些第三方,或者其他操作都会导致启动时间过长,所以建议不在Application中进行耗时操作,不参与业务操作,可以将部分初始化,类似友盟、第三方deBugly等初始化放在线程做操作

二:关于UI渲染效果检查工具和使用

 

相关文章:

  • 2021-11-10
  • 2021-04-17
  • 2021-10-03
  • 2021-10-04
  • 2021-11-12
  • 2021-08-27
  • 2021-08-21
  • 2021-12-03
猜你喜欢
  • 2021-08-18
  • 2021-12-07
  • 2021-11-08
  • 2021-10-11
  • 2021-10-16
  • 2021-11-27
  • 2021-11-11
  • 2021-05-08
相关资源
相似解决方案