自定义View-性能优化

1.内存优化

如果内存使用较多或者存在内存泄漏,导致系统GC频繁,从而造成页面卡顿,造成页面卡顿;
如果绘制时消耗时间过多或者做了很多不必要的绘制,严重时可能导致ANR;
如果控件的布局树复杂,冗余,嵌套太深,也会造成绘制性能的损耗;

使用占用内存较小的数据结构如SparseArray,对Bitmap进行压缩和复用,用一些工具如Memory Monitor,Allocation Tracker,MAT, LeakCanary进行内存分析和排查;
避免在onDraw或者onLayout这些绘制流程方法中创建对象,因为一个View的绘制可能比较频繁;

Memory Monitor:实时查看App的内存分配情况,快速判断App是否由于GC操作造成卡顿,快速判断App的Crash是否是因为超出了内存;
参看问题:
1.发现内存抖动的场景
2.发现大内存对象分配的场景
3.发现内存不断增长的场景
4.确定卡顿问题是否因为执行了GC操作

内存溢出(out of memory),是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;
内存泄露(memory leak),是指程序在申请内存后,完事儿之后,仍被其他对象持有其引用,而无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,最终会导致内存溢出。
在Android Studio中,我们可以在Monitor窗口中看到内存的使用情况,并进行手动GC,获取.hprof文件等操作

2.绘制优化

对于绘制优化,每秒传输帧数FPS不能低于60fps,就要保证每帧耗时不能超过16ms,否则会出现卡顿现象;第三方工具BlockCanary

屏幕上一个像素点在一个帧中被频繁绘制,就是过度绘制
手机开发者选项中开启调试GPU过度绘制,显示过渡绘制区域

3.布局优化

比如RelativeLayout嵌套了一个RelativeLayout,布局就冗余了,这时可以将布局文件中的根节点替换成merge标签,这样布局合并后,就减少了一个RelativeLayout的嵌套。
也可以使用ViewStub实现布局优化
布局优化的目的就是尽量减少布局的重叠和嵌套,尽量使用相对布局RelativeLayout和约束布局ConstraintLayout;

参考

Android应用开发进阶

你可能感兴趣的:(自定义View-性能优化)