Android 性能优化

Android 作为一种移动设备,内存资源和计算资源都受到限制,如果对内存使用不当,可能出现内存泄漏的问题,过多的使用内存,则有可能出现内存溢出,即OOM问题。而对 CPU 资源的不恰当使用则有可能出现 ANR 问题,针对这些问题,对于 Android 开发人员就提出了更高的挑战。本文将会介绍一下性能优化方案,包括:布局优化、绘制优化、内存泄漏优化、响应速度优化、 ListView 优化、 Bitmap 优化、线程优化等。

布局优化

布局优化的思想就是尽可能提交布局的层级,因为用xml编写的布局文件, Android 会将其解析然后经过测量、布局、绘制出来,减少布局层级可以减少 XML 解析的时间和对 View 的测量、布局、绘制的时间。
针对布局优化我们给出以下建议:

  1. 删去无用的控件层级
  2. 在保持布局层级不增加的情况下,尽可能使用 LinearLayout 和 FrameLayout 而不要使用 RelativeLayout。
  3. 使用 merge、 include 标签和 ViewStub 进行布局重用和布局优化。
  4. 绘制优化,在自定义控件时不要再 onDraw 方法中进行耗时操作,因为 onDraw 方法有可能被频繁调用。包括:新建局部对象、循环操作等。

内存泄漏优化

内存泄漏会使得系统不能释放无用的内存,轻则使得程序的内存占用居高不下,造成应用甚至系统的卡顿,重则造成 OOM 。下面就介绍几种常见的内存泄漏问题。

  1. Activity 中的静态变量持有当前 Activity 的应用,因为静态变量的生命周期和应用生命周期一样长。
  2. 单例模式造成的内存泄漏,单例对象不要持有非静态类的对象,例如 Activity 等,因为单例对象也是静态的,其生命周期和应用生命周期一致。
  3. 属性动画造成的内存泄漏,在 Activity 的 onDestroy 方法中要 cancel 掉属性动画。
  4. 资源未关闭造成的内存泄漏,包括:TypedArray 、 File 、 数据库 、 Bitmap 、 BraodcastReceiver 、 ContentObserver 等。
  5. 避免使用非静态内部类、匿名内部类。
  6. Handler 造成的内部泄漏,可以将 Handler 定义成静态的,然后通过弱引用引用外部类的对象,并且在 Activity 的 onDestroy 方法中移除消息队列中的消息。

响应速度优化

响应速度优化的核心思想是避免在主线程中做耗时操作,对于耗时操作可以将其移动到子线程之中去做,这样可以大大提升应用的响应速度。同时在新建线程时要使用线程池来管理线程,因为线程也是一种稀缺资源,它的创建和销毁都会消耗很多时间资源,通过线程池管理线程可以大大优化线程引起的性能开销。

ListView 和 Bitmap 优化

ListView 的优化主要在 Adapter 中,要通过 convertView 、 ViewHolder 复用对象。可以通过使用 RecyclerView 代替 ListView 和 GridView 。
Bitmap 的优化主要是在加载图片是对图片进行缩放,减少使用内存,避免 OOM 的发生。

一些性能优化建议

  1. 避免创建过多的对象,能使用局部变量解决的就不要定义成员变量,避免在循环中创建对象。
  2. 避免使用枚举,枚举比整形的内存占用要大。
  3. 使用 static final 来修饰常量。
  4. 使用 Android 特有的数据结构,包括: SparseArray 、 pair 等。
  5. 使用软引用和弱引用

小结

通过在日常编码中注意这些问题,可以编写出性能更好体验更优的代码,不积跬步,无以至千里;不积小流,无以成江海,每次的大突破就是由一次次的小进步组成的,加油!!!