美文网首页
性能优化

性能优化

作者: 好大一只鹏 | 来源:发表于2016-09-25 23:02 被阅读0次

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

    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的实例引用,无法被垃圾回收

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

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

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


      QQ图片20160926113601.png

    相关文章

      网友评论

          本文标题:性能优化

          本文链接:https://www.haomeiwen.com/subject/waifyttx.html