Android性能优化

作者: _Cancer | 来源:发表于2017-09-05 12:27 被阅读74次

    Android性能优化

    Android 性能优化的方法

    性能问题一般分为3类

    • UI卡顿
    • 内存问题
    • 耗电问题

    布局优化

    尽量减少布局文件的层级,减少Android绘制时的工作量

    1. 删除布局中无用的控件和层级
    2. 有选择的使用性能较低的ViewGroup,比如RelativeLayout
    3. 使用<include>,<merge>标签和ViewStub

    ViewStub: 非常轻量级,宽高都为0,它本身不参与任何的布局和绘制过程。它的意义在于按需加载所需的布局文件。

    绘制优化

    避免在ViewonDraw方法中执行大量操作,不要在其中创建新的局部对象,不要执行耗时操作

    内存泄漏优化

    • 内存泄漏的场景

      • 静态变量导致内存泄漏,例如静态变量引用Activity导致Activity无法销毁造成内存泄漏

      • 单例模式导致内存泄漏,单例的静态特性导致其生命周期同应用一样长
        解决方案:
        1. 将该属性的应用方式改为弱引用WeakReference
        2. 如果传入Context,使用ApplicationContext

      • 属性动画导致内存泄漏,记得在Activity的onDestroy方法中停止动画执行

      • Handler导致的内存泄漏,当Handler有延时任务或者消息队列等待的时间长,若Handler持有其他对象的引用,就会导致内存泄漏

      • 注册监听器导致内存泄漏,一定记得解除注册

      • Cursor,Stream没有close,View没有recyle导致内存泄漏

    • 内存泄漏分析可以使用leakcanary 或者 MAT

    ANR日志分析

    Android 规定如果一个程序在5秒钟之内无法响应屏幕触摸事件或者键盘输入事件就会出现ANR.

    这个时候系统就会在应用的 /data/anr目录下创建一个traces.txt文件,一些关于ANR的报错日志都会在这个文件当中,利于分析原因

    Bitmap优化

    主要是通过BitmapFactory.Options来根据需要对图片进行采样

    线程的优化

    采用线程池,线程池里面会重用线程,从而避免线程的创建和销毁带来性能的消耗,同时线程池还能有效的控制线程的最大并发数,避免大量的线程应为互相抢占资源导致线程阻塞现象的发生。

    一些性能优化的建议

    • 避免创建过多的对象
    • 不要过多的使用枚举,枚举占用的内存空间比整型大
    • 常量要使用 static final 修饰
    • 使用Android特有的一些数据结构,比如SparseArray和ArrayMap等,他们都具有更好的性能
    • 适当的使用软引用和弱引用
    • 采用内存缓存和磁盘缓存
    • 尽量采用静态内部类可以避免潜在的由于内部类而导致的内存泄漏
      * 非静态内部类和匿名类都会潜在的引用他们所属的外部类,但是静态内部类却不会,如果这个非静态内部类实例做了一些耗时操作,那么就会造成外围对象不会被回收,从而导致内存泄漏。
    • 耗电量优化建议:不要影响手机进入休眠,不要频繁唤醒手机,正确使用Alarm

    相关文章

      网友评论

        本文标题:Android性能优化

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