GeekBand 第十二周笔记

来源:互联网 发布:300451 创业软件 编辑:程序博客网 时间:2024/05/22 15:36

在 AS 上运行 MemoryBugs-master 项目,寻找潜在的内存问题。

1、 Leaks 显示出错误
这里写图片描述

sTextView被声明为静态变量,持有mContext上下文的引用,造成内存泄漏。

静态对象,在整个程序运行期间,是不会被垃圾回收的。

静态变量持有 另一非静态对象 的引用,导致这个非静态对象被销毁之后,也不能够被回收,导致内存泄漏 。

解决办法: sTextView取消 static 。

2、Allocation Tracking 检查
这里写图片描述

看到 MainActivity类中,创造了大量的 Rect, StringBuilder对象。

解决办法:尽量不要在for循环中新建对象。

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

3、不要在onDraw()方法中新建对象

因为onDraw()调用频率很高,所以尽量不要在该方法中新建对象。解决办法:在onDraw()方法外新建对象,变成全局变量使用。
 private void initView() {        mRect = new RectF(0, 0, 100, 100);        mPaint = new Paint();    }
    避免内存泄漏的方法        尽量不要让静态变量 引用Activity        使用 WeakReference        使用静态内部类来代替内部类        静态内部类使用 弱引用来 引用外部类        在声明周期结束的时候释放资源    减少内存使用        使用 更轻量的数据结构(比如SpareArray代替 HashMap)         避免在onDraw方法中创建对象。(该方法,频率很高)         对象池(Message.obtain()) (相当于对象缓冲)         LRUCache         Bitmap内存复用,压缩(inSampleSize, inBitmap)         StringBuilder    减少了内存使用,垃圾回收就会减少,内存抖动就会减少,使程序使用更加平滑,顺畅。
0 0