【发布时间】:2014-02-10 13:26:25
【问题描述】:
在我的Fragment 中,我有一个扩展LinearLayout 的自定义视图。我们就叫它gallery
在那个自定义视图中,我有 5 个ImageView。每个都包含一个从网络加载的图像。
当我的Fragment 不再需要时,我会销毁onDestroyView() 中的引用
@Override
public void onDestroyView() {
super.onDestroyView();
gallery = null;
}
我注意到,我的应用程序泄漏了内存,并且使用 DDMS 和 MAT 我发现那些 ImageViews 中的 5 个 Bitmap 仍在内存中。那不好。所以下一步我在我的mini gallery
@Override
protected void onDetachedFromWindow() {
super.onDestroyView();
imageView1 = null;
...
imageView5 = null;
}
这也没有帮助。在我最后一次尝试中,我这样做了
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
imageView1.setImageBitmap(null);
imageView1 = null;
...
imageView5.setImageBitmap(null);
imageView5 = null;
}
这有帮助。内存被释放,内存泄漏被堵塞。
现在我的问题是 - 为什么?为什么,当我的画廊没有被任何东西引用时,它不是GC'ed?甚至更多 - 当ImageView 没有引用它的内容 - 位图 - 从来没有GC'ed?我应该强制清理图像位图吗?
我注意到在使用ImageView 的其他自定义视图中,我遇到了类似的问题。此类情况的最佳做法是什么?
【问题讨论】:
-
你是如何破坏
View的?我的意思是,你调用/做什么来确保你的onDestroyView()方法被调用? -
它是 Fragment 生命周期的一部分。
-
没错,我的意思是
onDestroyView()只有在finish()方法被调用的时候才会被调用。 并不能保证您的onDestroyView()会被调用,并且可能是泄漏的来源。顺便说一句,在您的onDetachFromWindow()方法中,您只需调用super.onDestroyView(),您不会调用您的自定义实现。你可能想看看这个stackoverflow.com/questions/6117341/…
标签: android memory-leaks bitmap garbage-collection