Android - 内存泄漏还是?

时间:2011-04-07 07:14:51

标签: android memory spinner memory-leaks

两天前我注意到了一些事情。我在地图活动上有一个微调器。在活动的OnCreate()方法中,我使用数据填充微调器。之后我在DDMS中启动堆分析器,我开始打开/关闭微调器。我注意到当我打开微调器项目时VM分配内存,但是当我关闭它时,VM不会释放这个内存。我试图启动GC,但仍然分配了内存。我一个接一个地做了20次,分配的内存从3.5MB增加到7MB。怎么了?我在Google群组中发现了一个问题,但他们还没有回答 Spinner memory leak

我在spinner适配器中重写了所有代码,但问题仍然存在。 我在本主题中阅读了一些建议

Avoid memory leaks

有些事我没有得到:

当Drawable附加到视图时,视图将设置为drawable上的回调。在上面的代码片段中,这意味着drawable具有对TextView的引用,TextView本身具有对活动的引用(Context),该引用又引用了几乎所有内容(取决于您的代码。)

这是什么意思?如果我有一个textview并将其设置为一个drawable对象(我注意到drawable是静态的),textview对象有一个对drawable对象的引用,drawable对象也有对该视图的引用?如果这是真的,它们会被GC破坏,因为它们都互相引用?什么是对象之间的反向引用(回调)依赖?

1 个答案:

答案 0 :(得分:18)

很抱歉,我无法帮助您解决您的Spinner问题,但我可以尝试第二部分:

Android开发者博客上的Romain Guy帖子解释了两件重要的事情。

首先:

创建视图(TextView,ImageView ...)时,不得使用活动上下文

创建它
// DO NOT DO THIS
TextView label = new TextView(this);

否则View会获得对您的活动的引用,并且永远不会被取消分配。

相反,当您以编程方式创建View时,必须使用应用程序上下文:

TextView label = new TextView(getApplicationContext());

第二

当您将Drawable链接到View时,它会通过Context保持对您的活动的回调。如果你离开它,它会在你的活动被破坏时泄漏记忆。

要避免这种情况要做的是在活动被销毁时“将存储的drawables'回调设置为null”,例如,使用ImageView:

protected void onDestroy() {
    imageView.getDrawable().setCallback(null);
    super.onDestroy();
}

你必须为背景绘制做同样的事情......

希望它有所帮助。