Android - 内存泄漏还是?

Pla*_*lov 2 memory android memory-leaks spinner

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

我在spinner适配器中重写了所有代码,但问题仍然存在.我在这个主题中读到了一些建议

避免内存泄漏

有一些我没有得到的东西:

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

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

ol_*_*_er 18

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

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

第一:

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

// DO NOT DO THIS
TextView label = new TextView(this);
Run Code Online (Sandbox Code Playgroud)

否则View会获得对您的活动的引用,并且永远不会被释放.

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

TextView label = new TextView(getApplicationContext());
Run Code Online (Sandbox Code Playgroud)

第二:

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

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

protected void onDestroy() {
    imageView.getDrawable().setCallback(null);
    super.onDestroy();
}
Run Code Online (Sandbox Code Playgroud)

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

希望能帮助到你.

  • “当您将 Drawable 链接到视图时,它会通过上下文保持对您的活动的回调。” ---> ***这是不正确的***。回调在视图上。(它实现了 Drawable.Callback 接口而不是 Activity 的视图) (2认同)