Android - 使用图像资源背景动态构建UI时内存泄漏

时间:2011-01-10 20:47:30

标签: java android memory-management memory-leaks virtual-machine

我有一个活动,我发誓泄漏记忆。我正在处理的应用程序对图像做了大量工作,因此在直接使用Bitmaps时我必须非常吝啬内存。我添加了一个Activity,现在如果你使用这个新的Activity它基本上让我超过了mem使用的边缘,我最终抛出“Bitmap超过VM预算”异常。如果您从未启动过此活动,那么一切都会像之前一样顺利。

我开始阅读有关内存泄漏的内容,我认为我的情况类似于Android文档中的文章所描述的内容。我正在动态创建一堆图像视图,并从资源添加BackgroundDrawable并添加OnClickListener。我想当Activity在其生命周期中点击onPause时我必须做一些清理,但我想知道具体的方法是什么。

以下是应该演示我正在使用的对象的代码......

    LinearLayout templateContainer;
    .
    .
    .
    ImageView imgTemplatePreview = (ImageView) item.findViewById(R.id.imgTemplatePreview);
    .
    .
    .
    imgTemplatePreview.setBackgroundDrawable(getResources().getDrawable(previewId));
    imgTemplatePreview.setOnClickListener(imgClick);
    templateContainer.addView(item); 

2 个答案:

答案 0 :(得分:2)

富,

如果你打算处理那么多Bitmap s,你应该在不需要它们时积极地清理它们(onPause是一个好的开始)。

我记得很久以前关于ImageView s的讨论以及他们对显示的位图的延迟引用的奇怪行为。我记得你应该从ImageView中删除对当前上下文的所有引用,如果你要保持布局活着但不想泄漏。删除onClick侦听器和位图。如果您想积极释放内存,请致电.recycle() Bitmap。确保没有任何静态字段,其中包含对上下文或内部类引用的延迟引用。

在此期间,Android的启动器代码也被提及作为一个很好的参考,他们做了一些这样的事情。 OpenSource是你的朋友。

修改

找到Romain Guys的文章。基本上他虽然提到了这一部分

  

此示例是泄露Context的最简单的情况之一,您可以通过将存储的drawables的回调设置为null来查看我们如何在主屏幕的源代码中查找它(查找unbindDrawables()方法)活动被破坏了。

现在我从来没有必要管理这种类型的内存使用情况,所以从这里我建议查看The Home Screen Source以获取更多详细信息。你会在第620行找到他们的unbind()方法

答案 1 :(得分:0)

这听起来有点奇怪,但是我遇到的问题是在一个线程上执行任何位图操作的应用程序,而不是与您的Activity的Handler关联的线程。特别是,我有一个应用程序通过在java.util.Timer线程中进行图像处理来泄漏大量内存。当我将该代码迁移到使用Handler.postDelayed时,内存问题就会自行解决。