Android性能优化概述

作者: Demo_Yang | 来源:发表于2017-08-22 17:46 被阅读55次

    对于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来根据需要对图片进行采样。

    性能优化建议

    避免创建过多的对象
    不要过多使用枚举,枚举占用的内存空间要比整型大
    常量请使用static final来修饰
    适当会用软引用和弱引用
    采用内存缓存和磁盘缓存
    尽量采用静态内部类,这样可以避免潜在的由于内部类而导致的内存泄露

    相关文章

      网友评论

        本文标题:Android性能优化概述

        本文链接:https://www.haomeiwen.com/subject/jedarxtx.html