Sunxin'Blog

Android性能优化

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
-------------本文结束感谢您的阅读-------------