我正在创建一个Android应用程序,该应用程序可以动态地从Internet下载图像,然后将其放置在ImageView
上,从而允许用户设置默认图像和突出显示的图像。为此,我下载数据并将其保存到文件中,无论何时需要图像,我都会从该文件中创建一个BitmapDrawable
并将其放置在StateListDrawable
中。当不再需要ImageView
时,处置StateListDrawable
的正确方法是什么,这样我就不会泄漏内存,并且它们会被垃圾回收?我是否应该保存对BitmapDrawable
中每个StateListDrawable
的引用,以便可以对其调用回收?将StateListDrawable
回调设置为null怎么办?还是将ImageView
设置为null足以不泄漏内存?
谢谢!
最佳答案
Java VM将自动负责收集您不需要的StateListDrawable
。您要做的就是确保无法将StateListDrawable
本身从程序中引用,方法是将引用重新分配给另一个Object
,或者将引用设置为null
。即使StateListDrawable
是否仍然保留对您要保留的其他对象的引用(例如您讨论的回调),甚至没有关系...一旦无法引用Object
,它就有资格进行垃圾回收。当VM认为是释放内存的好时机时,它将为您删除StateListDrawable
,您无需担心自己对任何对象调用recycle()
。
如果您正在使用Eclipse进行编辑,则查看此错误的一种简单方法是在程序在模拟器中运行时查看LogCat消息。偶尔会有消息说:“ GC释放了xxx个对象/以xxx毫秒为单位的xxx字节。”
从Java tutorials:
“某些面向对象的语言要求您跟踪所有
您创建的对象,并且当它们被显式销毁时
不再需要。 Java平台允许您创建尽可能多的
您想要的对象(当然,受系统可以限制的对象
处理),而您不必担心销毁它们。 Java
运行时环境在确定对象是对象时将其删除
不再使用。此过程称为垃圾收集。
没有更多对象时,该对象可以进行垃圾回收
对该对象的引用。变量中包含的引用是
通常在变量超出范围时删除。或者,您可以
通过将变量设置为显式删除对象引用
特殊值null。请记住,一个程序可以有多个
引用同一对象;对对象的所有引用必须是
在对象有资格进行垃圾回收之前删除。”
编辑:从documentation的'Bitmap.recycle()`,
“释放与此位图关联的本机对象,并清除
参照像素数据...这是一个高级调用,通常
无需调用,因为正常的GC流程将释放此
当不再有对该位图的引用时,内存。”