性能优化

  • 布局优化

    • 减少布局层次,单一可以用LinearLayout 解决的页面不用 RelativeLayout,如果布局复杂,则用RelativeLayout 更好,毕竟比起布局嵌套,这种会好些

    • <include> 标签使用,主要用于布局重用

      需要注意的是:此标签内,如果外面指定了 id 里面跟布局也定义id 以外部定义为准。同时如果里面定义了 类似于 android:layout_width="wrap_content" 的属性,需配套 android:layout_height="wrap_content" 同时使用。

    • <merge> 标签一般和 <include> 标签配合使用。一般如果当前根布局例如是:LinearLayout ,include 的布局也是 LinearLayout ,那么 include 的根布局就可以使用 <merge> 标签代替LinearLayout.

    • <ViewStub> 标签,意义为按需加载,轻量级,宽和高都是0,在实际开发中,有很多布局在正常情况下不会显示,比如网络异常的布局,这个时候没有必要在布局加载时就加载进来,通过<ViewStub> 就可以在需要用到的时候再加载,提高程序初始化的性能。

  • 绘制优化

    onDraw() 中不要创建新的局部对象,这是因为 onDraw() 可能会频繁的调用,这样就会在一瞬间产生大量的临时对象,这不仅占用过多的内存而且会导致系统频繁的gc, 降低程序的执行效率; 另外也不能做一些耗时的任务。

  • 内存泄漏优化

    • 静态变量导致的内存泄漏

      例如:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      private static Context mContext;

      @Override
      protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.layout_combine);

      mContext = this;
      }
    • 单例模式导致的内存泄漏

    • 属性动画导致的内存泄漏

      Android 3.0 之后,提供了属性动画,如果开启无限循环动画,隐藏后,未调用 animator,cancel() 来停止动画,也会发生内存泄漏,因为这个时候 ActivityView 被动画所持有,而 View 又持有 Activity, 最终Activity 无法释放。0-

  • 响应速度优化和ANR日志

    响应速度优化的核心是避免在主线程做耗时操作, Activity 5s 未做出响应, Service 10s未做出响应,就会出现 ANR ,查看 \data\anr 目录下的 trace,txt 文件分析产生 ANR 的原因

  • 线程优化

    线程优化一般都是采用线程池,避免程序中存在大量的 Thread, 线程池可重用内部的线程,从而避免线程的创建和销毁所带来的性能开销。

-------------本文结束感谢您的阅读-------------