Fork me on GitHub

Android性能优化小结

关于Android性能优化,主要包括以下几点

  1. 布局优化
  2. 绘制优化
  3. 内存泄露优化
  4. 响应速度优化
  5. 线程优化
  6. ListView/RecyclerView优化
  7. Bitmap显示优化
  8. 其他杂七杂八的优化
  • 布局优化

    布局优化主要是通过减少布局文件的层级来实现。

    1. 删除布局中无用的控件和层次,有选择性的选择布局文件。

    如能使用LinearLayout或者FrameLayout实现的,就不要选择使用RelativeLayout。因为RelativeLayout布 局需要消耗更多CPU计算时间。当然这是在同样的层级数量为前提的。

    1. 使用标签,include、ViewStub等。

      ViewStub提供了按需加载的功能,当需要时才会将ViewStub中的布局加载到内存,提高了程序初始化效率。

    2. 避免过度绘制。如移除不必要的背景色

  • 绘制优化

    绘制优化主要指onDraw中要避免执行大量操作。

    1. onDraw中不要创建新的临时对象。

      因为onDraw方法可能会被频繁调用,导致一瞬间产生大量对象,这样不仅占用了过多内存,而且会导致系统频繁gc,降低了程序执行效率。

    2. onDraw中不要做耗时任务,避免执行循环操作。

      尽管每次循环都很轻量级,但是大量的循环仍然十分抢占CPU的时间片,这会造成View的绘制过程不流畅。

  • 内存泄露优化

    写代码的时候避免写出内存泄露的代码。使用工具分析潜在的内存泄露。

    具体见 http://darrenfantasy.com/2017/11/13/memory-leak/

  • 响应速度优化

    响应速度优化核心思想就是避免在主线程做耗时操作。

    耗时操作放到子线程,采用异步的方法来执行耗时操作。Android中,Activity在5s不能响应屏幕触摸事件或者键盘输入事件就会ANR。BroadcastReceiver在10s内未执行结束也会ANR。

  • 线程优化

    线程优化就是采用线程池的方式来避免内存中同时存在大量的Thread,线程池可以重用内部的线程,从而避免了线程的创建和销毁所带来的开销。同时线程池还能有效控制线程池的最大并发量,避免大量线程因互相抢占资源而导致阻塞现象的发生。

  • ListView/RecyclerView优化

    listview使用contentview进行复用,而不是每一次都去new一个。

    使用ViewHolder,避免每次都去findViewById()来获取控件。

    如果item中有图片,在滑动过程中停止加载图片。

  • Bitmap优化

    主要是对图片进行压缩处理。

    具体见 http://darrenfantasy.com/2016/09/27/bitmap/

  • 其他杂七杂八的优化

    Android中少使用枚举,枚举占的内存大。

    常量使用static final修饰。

    适当使用软引用和弱引用。

    使用Android特有的数据结构,如SparseArray。

暂时就想到这么多啦。有遇到新的优化方案会继续更新上去。。。。。