作业

当旋转两次屏幕

此时的JAVA Heap如下图:

作业_第1张图片
有重复的Rect和Paint对象

在MyView类中找到了原因是在onDraw方法中创建了这两个对象

      protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        RectF rect =  new RectF(0, 0, 100, 100);    
        Paint paint = new Paint();
        paint.setColor(Color.RED); 
        paint.setStrokeWidth(4);
        canvas.drawArc(rect, 0, 180, true, paint);
    }
作业_第2张图片
Paste_Image.png

说明静态变量的创建没有问题

点击了”StartAllocation“

通过观察MemoryMonitor发现内存抖动现象,如下图


再进一步通过AllocationTracker定位到了发生此现象的原因
点击事件触发了startAllocationLargeNumbersOfObjects()方法而在该方法中进行了一个for循环不断的创建Rect对象


作业_第3张图片

代码如下:
for (int i = 0; i < 10000; i++) {
Rect rect = new Rect(0, 0, 100, 100);
System.out.println("-------: " + rect.width());
}

代码修改为:

      Rect rect = new Rect(0, 0, 100, 100);
      StringBuilder stringBuilder= new StringBuilder("-------: ");
      stringBuilder.append(rect.width());
      for (int i = 0; i < 10000; i++) { 
         System.out.println(stringBuilder);
      }
作业_第4张图片
修改代码后AllocationTracker的显示结果

点击”StartActivityB“按钮

旋转屏幕在通知栏显示存在内存泄漏


作业_第5张图片
Paste_Image.png

可以看出静态变量sTextView、mHandler持有MainActivity的引用造成了内存泄漏


作业_第6张图片
将TextView改为去掉静态,Handler改为静态并在OnDestroy方法中mHandler.removeCallbacksAndMessages(null);再运行结果如图

你可能感兴趣的:(作业)