扩展ImageView会导致内存泄漏

时间:2015-08-05 17:56:56

标签: java android memory-leaks imageview

美好的一天

我正在扩展ImageView类,因为我需要它成为一个正方形,问题是它似乎导致内存泄漏,因为如果我使用未扩展的ImageView类MAT中没有输出。这是扩展版本,您可以看到非常简单:

public class SquareImageView extends ImageView {

    public SquareImageView(Context context) {
        super(context);
    }

    public SquareImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SquareImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, widthMeasureSpec);
    }

}

我将它实现为GridView项,如下所示:

<FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:foreground="@drawable/item_button">

    <com.gc.materialdesign.views.ProgressBarCircularIndeterminate
            android:id="@+id/progressBarCircularIndeterminate"
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:layout_gravity="center"
            android:background="@color/orange"/>

    <!-- if I use <ImageView/>, everything is ok -->
    <com.example.widgets.SquareImageView
            android:id="@+id/picture"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop"/>

</FrameLayout>

这是我在打开和关闭包含gridview 10次的片段后得到的直方图,因为你可以看到保留的堆很大,此时我已经强制GC了:

enter image description here

包含10个保留对象中的1个的传入引用的列表:

enter image description here

gc root的路径(不包括弱引用):

enter image description here

我设法通过回收ImageView位图来减少保留的堆:

enter image description here

但我无法弄清楚为什么要保留这10个物体。正如我在开始时所说的那样,如果我使用ImageView而不是扩展名,则根本没有泄漏。如果你能给我一个提示,那就太棒了。

0 个答案:

没有答案