Android性能优化篇

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaozhiwen6140/article/details/85165977

1.布局优化

(1)有选择的使用性能低的布局,比如RelativeLayout,在绘制布局的过程中,会占用更多的CPU时间。如果使用LinearLayout(或者FramLayout)跟RelativeLayout能达到相同的目的的话,那就用LinearLayout。但是使用LinearLayout时需要增加层级嵌套与使用RelativeLayout相比的话,还是使用RelativeLayout更好一些,因为嵌套同样会降低层级。

(2)在布局文件中使用<merge>,<include>标签以及ViewStub布局。<include>标签一般用于布局重用,<merge>标签用于减少布局的层级,ViewSub提供了按需加载的功能,当只有需要的时候,才会把ViewSub中的布局加载到内存中,极大的提高了初始化的效率。

a.include标签只支持以android:layout_开头的属性,同时必须要指定android:layout_width以及android:layout_height属性其他的属性才能生效,其他属性是不支持的,但是有个特例是android:id。

b.ViewStub的宽与高都是0,本身不参与任何的布局以及绘制过程。开发过程中,有些文件在正常情况下不会展示,就不需要一开始就加载到内存中。反而应该在需要的时候再加载。加载的时候,只需要声明一个ViewStub的控件(假设是viewStub),以下两种方式都可以使ViewStub被内部的布局替换掉。同时,ViewStub不支持<merge>标签。

viewStub.setVisibility(View.VISIBLE);
viewStub.inflate();

2.绘制优化

View的onDraw()避免执行大量操作。

(1)在onDaw()中尽量不要创建新的局部对象。因为onDraw()可能会被频繁调用,这样就会在一瞬间产生大量的临时对象。不仅会占用过多内存而且会造成系统频繁GC,降低了程序的执行效率。

(2)在onDraw()方法中不要做耗时任务。也不能执行成千上万的循环操作。因为大量的循环仍然十分抢占CPU的时间,会造成View绘制不流畅。按照Google给出的性能优化的典范标准,View的绘制帧率是60fps,即要求每一帧的绘制时间不超过16ms.降低onDraw()的复杂度是有效的。

3.内存泄露优化

(1)静态变量导致的内存泄露(例子如下:因为有静态变量的引用会界面导致无法销毁)

private static Context mContext;

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

    mContext = this;
}

(2)单例模式导致的内存泄露(一般是在单例的对象或者是接口中传入了Activity对象或者Activity类型的Context):

(3)属性动画造成的内存泄露

属性动画中有一类无限循环的动画(代码示例如下),如果在Activity中播放动画但是没有在退出界面时销毁动画,即便是界面不可见,动画也是会一直执行。而此时View对象被animator持有,Activity对象被View持有,导致内存泄露。解决方法是需要在Activity的onDestroy()方法中添加animator.cancel();销毁动画。

ObjectAnimator animator = ObjectAnimator.ofFloat(imageView,"rotation",0,360);
animator.setRepeatCount(ValueAnimator.INFINITE);

4.响应速度优化以及ANR日志分析

核心思想是避免在主线程中做耗时的事情,需要尽量把耗时的事情放在子线程中去执行。响应速度过慢更多的体现在Activity的启动速度上,如果在主线程中做的事情太多,Activity在启动的时候会出现黑屏的现象,甚至出现ANR。Android规定,如果Activity无法在5s之内响应屏幕的触摸事件或者键盘的输入事件,广播如果在10s之内还没有执行完操作,都会出现ANR。实际开发中,ANR难以在代码中发现问题,但是,当进程出现ANR时,系统会在/data/anr目录下创建一个traces.txt文件,通过分析这个文件就可以定位出ANR的原因。

5.ListView优化(现在一般使用RecyclerView)

(1)采用ViewHolder,避免在getView()中执行耗时操作。

(2)根据列表的滑动状态控制任务的执行频率,比如当列表快速滑动时,不应该开启大量的异步线程。

(3)可以尝试开启硬件加速使ListView的滑动更加流畅。

6.线程优化

线程优化的思想是使用线程池,避免程序中存在大量的Thread。线程池可以重用内部的线程,避免了线程创建以及销毁带来的性能开销。同时,线程池还能有效控制线程的最大并发数,避免大量线程因为互相抢占资源而造成阻塞现象。

7.性能优化建议

(1)避免创建过多的对象

(2)不要过多的使用枚举,枚举所占用的内存空间比整型要大

(3)常量使用 static final 来修饰

(4)使用一些Android特有的数据结构,比如SparseArray 以及Pair,它们都有好的性能。

(5)适当使用软引用跟弱引用

(6)采用内存缓存和磁盘缓存

(7)尽量采用静态内部类,能避免由于内部类存在的内存泄漏问题。

猜你喜欢

转载自blog.csdn.net/zhaozhiwen6140/article/details/85165977