Android开发艺术探索:Android性能优化

常用的优化方法:布局优化,绘制优化,内存泄露优化,响应速度优化,ListView优化,Bitmap优化,线程优化。

布局优化

尽量减少布局文件的层级,可以使用,标签和ViewStub。 标签配合使用,ViewStub提供按需加载的功能。

可以将一个制定的布局文件加载到当前的布局文件中,只支持android:layout_开头的属性,除了android:id:

<include
   android:id="@+id/title"
   android:layout_width="match_parent" 
   android:layout_width="match_parent"
   layout="@layout/title"
   />

配合一起减少布局层级,如果在中的外层已经包含了ViewGroup组件,如果被包含进来的布局文件外层和include标签的外层相同,那么就可以使用merge标签去掉多余的那一层ViewGroup。

ViewGroup继承了View,宽和高都是0,不参与布局和绘制过程。可以实现按需加载:

<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_parent"
    android:layout_gravity="bottom"
/>

stub_import是ViewStub的id,panel_import是layout_network_error这个布局的根元素的id,实现按需加载

findViewById(R.id.stub_import).setVisibility(View.VISIBLE);

//或者
View importPanel = (ViewStub)findViewById(R.id.stub_import).inflate();

另外ViewStub不支持标签。

绘制优化

降低View的onDraw的复杂度,尽量不要在里面创建对象。

内存泄露优化

响应速度优化

Activity如果5秒钟之内无法响应速度屏幕触摸事件或者键盘输入事件就会出现ANR,BroadcastReceiver如果10秒钟之内还未执行完操作也会出现ANR。
可以在/data/anr目录下创建一个文件traces.txt,当一个进程发生了ANR就会被记录在这个文件里面。

ListView和Bitmap优化

ListView:采用ViewHolder避免在getView执行耗时操作,根据滑动状态来控制任务的执行频率,,开启硬件加速。
Bitmap:主要是通过BitmapFactory.Options来对图片进行采样,根据需要图片的大小对BitmapFactory.Options的inSample参数进行设置。

线程优化

采用线程池,避免创建大量的Thread。

一些优化建议

使用MAT工具分析内存泄露。