性能优化

当我们点击了StartActivityB,内存情况是这样的,发生了内存泄露

性能优化_第1张图片
QQ图片20160925221213.png

并且用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());  
  }
}

在这里,我们发现了一个非静态内部类的静态实例造成的泄露,


QQ图片20160925224543.png

Handler 造成的内存泄露:在这里我们的handler是持有MainActivity的实例引用,无法被垃圾回收

性能优化_第2张图片
QQ图片20160925224825.png
  • 解决办法
    1.不要让静态变量引用Activity
    2.使用WeakReference
    3.使用静态内部类来代替内部类
    4.静态内部类使用弱引用来引用外部类
    5.在声明周期结束的时候释放资源
  • 减少内存使用
    1.使用更轻量级的数据结构
    2.避免在onDraw方法中创建对象
    3.使用对象池(Message.obtain())
    4.LRUCache
    5.Bitmap内存的复用,压缩
    6.StringBuilder

UI自定义控件部分出现了过度绘制

  • 在自定义的部分中,onDraw中创建了对象,而且是两个对象
性能优化_第3张图片
QQ图片20160926111009.png
  • 在UI中使用了RelativeLayout
性能优化_第4张图片
QQ图片20160926111337.png
  • 解决办法,避免UI的卡顿
    避免在onDrawn中创建对象
    减少View的层级
    避免在UI顶层使用RelativeLayout
    自定义控件控制绘制的复杂度
  • 优化过度绘制
    减少View的层级
    减少不必要的背景
    .9图用作背景
    ViewStub
    ClipRect&QuickReject
    在这里我们要修改onDraw()方法


    性能优化_第5张图片
    QQ图片20160926113601.png

你可能感兴趣的:(性能优化)