作业

作者: timber_wu | 来源:发表于2016-09-26 22:16 被阅读10次

    当旋转两次屏幕

    此时的JAVA Heap如下图:

    有重复的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);
        }
    
    Paste_Image.png

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

    点击了”StartAllocation“

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


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


    代码如下:
    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);
          }
    
    修改代码后AllocationTracker的显示结果

    点击”StartActivityB“按钮

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


    Paste_Image.png

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


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

    相关文章

      网友评论

          本文标题:作业

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