我在spinner适配器中重写了所有代码,但问题仍然存在。 我在本主题中阅读了一些建议
有些事我没有得到:
当Drawable附加到视图时,视图将设置为drawable上的回调。在上面的代码片段中,这意味着drawable具有对TextView的引用,TextView本身具有对活动的引用(Context),该引用又引用了几乎所有内容(取决于您的代码。)
这是什么意思?如果我有一个textview并将其设置为一个drawable对象(我注意到drawable是静态的),textview对象有一个对drawable对象的引用,drawable对象也有对该视图的引用?如果这是真的,它们会被GC破坏,因为它们都互相引用?什么是对象之间的反向引用(回调)依赖?
答案 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();
}
你必须为背景绘制做同样的事情......
希望它有所帮助。