当我们点击了StartActivityB,内存情况是这样的,发生了内存泄露
并且用Allocation Tracking检测到创建了很多的Rect对象,造成的原因是一下代码
private void startAllocationLargeNumbersOfObjects() {
Toast.makeText(this, "请注意查看MemoryMonitor 以及AllocationTracker", Toast.LENGTH_SHORT).show();
for (int i = 0; i < 10000; i++) {
Rect rect = new Rect(0, 0, 100, 100);
System.out.println("-------: " + rect.width());
}
}
在这里,我们发现了一个非静态内部类的静态实例造成的泄露,
Handler 造成的内存泄露:在这里我们的handler是持有MainActivity的实例引用,无法被垃圾回收
- 解决办法
1.不要让静态变量引用Activity
2.使用WeakReference
3.使用静态内部类来代替内部类
4.静态内部类使用弱引用来引用外部类
5.在声明周期结束的时候释放资源 - 减少内存使用
1.使用更轻量级的数据结构
2.避免在onDraw方法中创建对象
3.使用对象池(Message.obtain())
4.LRUCache
5.Bitmap内存的复用,压缩
6.StringBuilder
UI自定义控件部分出现了过度绘制
- 在自定义的部分中,onDraw中创建了对象,而且是两个对象
- 在UI中使用了RelativeLayout
- 解决办法,避免UI的卡顿
避免在onDrawn中创建对象
减少View的层级
避免在UI顶层使用RelativeLayout
自定义控件控制绘制的复杂度 -
优化过度绘制
减少View的层级
减少不必要的背景
.9图用作背景
ViewStub
ClipRect&QuickReject
在这里我们要修改onDraw()方法