美好的一天
我正在扩展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了:
包含10个保留对象中的1个的传入引用的列表:
gc root的路径(不包括弱引用):
我设法通过回收ImageView位图来减少保留的堆:
但我无法弄清楚为什么要保留这10个物体。正如我在开始时所说的那样,如果我使用ImageView
而不是扩展名,则根本没有泄漏。如果你能给我一个提示,那就太棒了。