一、性能优化:
分为三个大方向:布局优化、绘制优化、内存优化
(1)布局优化(5种):
①删除布局中无用的控件和层级
②有选择地使用性能较低的ViewGroup。
既可以使用RelativeLayout和LinearLayout时,且不影响层级的前提下,选择LinearLayout。
RelativeLayout会对子View进行两次的onMeasure,横向和纵向各一次。而LinearLayout只onMeasure一次。
但如果LinearLayout使用weight时,LinearLayout也会进行两次的onMeasure。
③使用<include>标签重用Layout
④使用<merge>标签减少层级
⑤使用ViewStub实现View的延迟加载
(1.使用setVisibility或inflate,后者可以返回布局的引用,从而可以再通过View.findViewById()方法找到对应的控件
2.ViewStub在使用时才渲染整个布局,而View.GONE在初始化布局树时,已经添加在布局树上)
(2)绘制优化:
主要指View的onDraw方法避免执行大量的操作
①onDraw中不要创建新的局部对象
②onDraw中不要做耗时的任务
(3)内存优化(7种):
①对常量使用static修饰符
②使用静态方法
③减少不必要的成员变量
④减少不必要的对象
⑤尽量不要使用枚举,少用迭代器
⑥对Cursor、FIle、Context、BroadcastReceiver进行资源的释放,关闭、注销。
⑦静态变量的慎重使用,避免引用资源耗费过多的实例,比如context。
⑧ListView优化:
1.复用converView,减少不必要的view的创建;
2.使用converView的setTag和getTag方法将view与相应的viewHolder绑定,减少findViewById操作;
3.使用RecycleView代替ListView,因为RecycleView可以实现单个item的刷新。
⑨Bitmap优化:
1.使用BitmapFactory.Options进行采样,然后算出需要压缩的比例大小,对图片进行压缩
部分关键代码:
// 获得图片的宽和高,并不把图片加载到内存中
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
options.inSampleSize = caculateInSampleSize(options,
width, height);
// 使用获得到的InSampleSize再次解析图片
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(path, options);
/**
* 根据需求的宽和高以及图片实际的宽和高计算SampleSize
*
* @param options
* @param reqWidth
* @param reqHeight
* @return
*/
public static int caculateInSampleSize(BitmapFactory.Options options, int reqWidth,
int reqHeight)
{
int width = options.outWidth;
int height = options.outHeight;
int inSampleSize = 1;
if (width > reqWidth || height > reqHeight)
{
int widthRadio = Math.round(width * 1.0f / reqWidth);
int heightRadio = Math.round(height * 1.0f / reqHeight);
inSampleSize = Math.max(widthRadio, heightRadio);
}
return inSampleSize;
}
2.使用软引用
3.使用二级缓存(内存缓存和磁盘缓存)
4.使用完后,使用recycle()进行资源回收。
5.图片加载可以使用一些成熟的框架,比如Gilde、Picasso之类的加载
⑩线程优化:
1.将线程的内部类改为静态内部类(因为非静态内部类拥有外部类对象的强引用,静态内部类则没有)。
2.使用弱引用来保存context引用。
二、优化工具与手段:
①TraceView:数据采集和分析工具
②Lint:软件代码静态分析工具
③MemoryMonitor:内存泄漏分析工具
④LeakCanary:内存泄漏检测利器