《Android开发艺术探索》——Android性能优化
Android性能优化主要包括布局优化、绘制优化、内存泄漏优化、相应速度优化、ListView优化、Bitmap优化、线程优化。
布局优化
布局优化主要是通过减少布局文件的层级实现。其次选择地使用性能较低的ViewGroup,比如RelativeLayout。如果布局中既可以使用LinearLayout
也可以使用RelativeLayout,那么就采用LinearLayout,这是因为RelativeLayout的功能比较简单他的布局过程需要花费更多的CPU时间。FrameLayout和LinearLayout一样都是一种简单高效的ViewGroup。
布局优化的另一种手段就是采用<include>标签、<merge>标签和ViewStub。<include>标签主要用于布局重用,<merge>标签一般和<include>配合使用,他可以减少布局的层级,
而ViewStub则提供了按需加载的功能,当需要时才会将ViewStub中的布局加载到内存中,提高了程序初始化的效率。
ViewStub继承了View,它非常轻量级且宽/高都是0,因此它本身不参与任何的布局和绘制过程。ViewStub的意义在于按需加载所需的布局文件,在实际开发中,有很多布局文件在正常情况下不会显示,比如网络异常时的界面,这个时候就没有必要在整个界面初始化的时候将其加载进来,通过ViewStub就可以做到在使用的时候再加载,提高了程序初始化的性能。一个ViewStub的布局如下
<ViewStub
android:id="@+id/stub_import"
android:inflatedId="@+id/panel_import"
android:layout="@layout/layout_network_error"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"/ >
其中stub_import是ViewStub的id,而panel_import是layout/layout_network_error这个布局的根元素id,在需要加载ViewStub中的布局时,可以按照如下两种方式进行
((ViewStub) findViewById(R.id.stub_import).setVisibility(View.VISIBLE));
或者View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();
当ViewStub通过setVisibility或者inflate方法加载后,ViewStub就会被它内部的布局替换掉,这个时候ViewStub就不再是整个布局结构中的一部分了。
绘制优化
绘制优化是指View的onDraw方法要避免执行大量的操作。首先,onDraw中不要创建局部对象,这是因为onDraw方法可能会被频繁调用,这样会在一瞬间产生大量的临时对象,这不仅占用了过多的内存而且还会导致系统更加频繁的GC,降低了程序的执行效率。另一方面,onDraw方法中不要做耗时的任务,也不能执行成千上万次的循环操作,尽管每次循环都是轻量级,但是大量的循环仍然十分抢占CPU时间片,这样会造成View绘制过程不流畅。按照Google官方给出的性能优化典范中的标准,View的绘制帧率保证60fps是最佳的,这邀请每帧的绘制时间不超过16ms.
内存泄漏优化
内存泄漏一般包含以下几种
1、静态变量导致的内存泄漏。
2、单例模式导致的内存泄漏。
3、属性动画导致的内存泄漏。
4、资源未关闭导致的内存泄漏。
响应速度优化
相应速度优化,就是尽可能的将耗时操作放到非主线程中执行,这样也可以减少ANR.
ListView和Bitmap优化
ListView优化主要通过采用ViewHolder并避免在getView中执行耗时操作;其次要根据列表的滑动状态来控制任务的执行效率;Bitmap优化在下一次介绍。
线程优化
就是避免应用中开启过多的线程,可以通过使用线程池的方式来实现。
关于应用中的内存泄漏问题可以采用Eclipse或者AndroidStudio附带的MAT工具来侦测。