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做同样的事情......
希望能帮助到你.
归档时间: |
|
查看次数: |
3530 次 |
最近记录: |