对于Android的性能优化,想必大家并不陌生,但是没有真正的总结一下,在此我根据自己平时开发,在结合一些读书笔记,对Android的性能优化,进行一些总结。
Android设备作为一种移动设备,不管是内存还是CPU的性能都受到了一定的限制,无法做到像PC设备那样的超大内存和高性能的CPU。 因此,这也意味着,Android不能无限制的使用内存和CPU资源,过多的使用内存会导致程序内存溢出,即OOM。而过多的使用CPU资源,一般是指大量的耗时任务,会导致手机变得卡顿甚至无法响应的情况,即ANR。性能优化的主要是包括布局优化、绘制优化、内存泄露优化、响应速度优化、Bitmap优化、线程优化。
性能优化中一个很重要的问题就是内存泄露,内存泄露并不会导致程序功能异常,但是它会导致Android程序的内存占用过大,这将提高内存溢出的发生几率。在设计程序的时候,还有一个问题也是不可忽略的,那就是代码的可维护性和可扩展性。如果一个程序的可维护性和可扩展性很差,那就意味着后续的代码维护代价是相当高的。
布局优化
一
优化布局就是尽量减少布局文件的层级,布局中的层级减少了,这就意味着Android绘制时的工作量减少了。
首先删除布局中的无用的控件和层级,其次有选择地使用性能较低的ViewGroup。如果布局中既可以使用LinearLayout也可以使用RelativeLayout,那么采用LinearLayout,这是因为RelativeLayout的功能比较复杂,它的布局过程需要花费更多的CPU时间。
二
采用标签
<include>标签
这个标签用于布局的重用,可以将一个指定的布局文件加载到当前的布局文件
<merge>标签
由于当前布局是一个竖直方向的LinearLayout,这个时候如果被包含的布局文件中也是采用了竖直方向的LinearLayout,那么被包含的布局文件当中的LinearLayout是多余的,通过<merge>标签就可以去掉多余的那一次LinearLayout。
ViewStub
ViewStub继承了View,它非常轻量级且宽高都是0,因此它本身不参与任何的布局和绘制过程。ViewStub的意义在于按需加载所需的布局文件,这样就是没有必要在整个界面初始化的时候将其加载进来,通过ViewStub就可以做到在使用的时候再加载。
绘制优化
内存泄露优化
内存泄露优化有两个方面,一方面是在开发过程中避免写出有内存泄露的代码,另一方面是通过一些分析工具找出潜在的内存泄露。
场景1:静态变量导致的内存泄露
场景2:单例模式导致的内存泄露
泄露的原因是Activity的对象被单例模式所持有,而单列模式的特点是其生命周期和Application保持一致,因此Activity对象无法被及时释放。
场景3:属性动画导致的内存泄露
属性动画有一类是无限循环的动画,如果在Activity中播放此类动画且没有在onDestory中去停止动画,那么动画会一直播放下去,尽管已经无法在界面上看到动画效果了,并且这个时候Activity的View会被动画持有,而View又持有了Activity,最终Activity无法释放。解决方法是在Activity的onDestory中调用animator.cancel()来停止动画。
Bitmap优化
主要是通过BitmapFactory.Options来根据需要对图片进行采样。
网友评论