2011-04-07 87 views
2

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

我重写了所有我的代码在微调适配器,但问题仍然存在。 我读了一些意见这个话题

Avoid memory leaks

中也有一些是我没得到:

当可提拉连接到一个视图,该视图设置为在绘制的回调。在上面的代码片段中,这意味着drawable引用了TextView,它本身具有对活动的引用(Context),它依次引用任何东西(取决于您的代码)。

什么这是什么意思?如果我有一个textview并将其设置为可绘制对象(我注意到drawable是静态的),textview对象具有对可绘制对象的引用,并且可绘制对象也具有对该视图的引用?如果这是真的,他们变得不可被GC破坏,因为他们都有彼此的引用。什么是这些对象之间的回参考(回调)依赖关系?

+0

没有得到,要么tbh – 2017-01-14 09:07:32

回答

18

抱歉,我不能帮助你的微调的问题,但我可以在第二部分一试:

在Android开发者博客罗曼盖伊后解释两个重要的事情。

第一:

当您创建一个视图(TextView的,ImageView的......),你不能与活动场景

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

创建它,否则查看到您的活动的参考和意志永远不会被释放。

相反,当您创建一个视图编程,你必须使用应用程序上下文:

TextView label = new TextView(getApplicationContext()); 

二:当您链接被拉伸到一个视图

,它不断回调您的活动通过上下文。如果你离开它,当你的活动被破坏时它会泄漏内存。

做,以避免这种事情是这样的例子蒙山一个ImageView的到“活动时被销毁设置存储可绘回调空”:

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

你要做的背景相同可绘制...

希望它有帮助。

+0

惊讶这没有得到upvoted足够的。 – sdfwer 2012-05-11 14:27:47

+1

“当您将Drawable链接到视图时,它会通过上下文对您的活动进行回调。” ---> ***这是不正确的***。回调是在视图上。 (它实现Drawable.Callback接口的视图不是活动) – 2013-05-12 22:58:32

+0

@ol_v_er您能分享罗曼盖伊解释这个的链接吗? – 2016-03-23 12:38:55