我正在创建一个android应用程序,它可以动态地从互联网下载图像,然后将它们放到ImageView上,允许用户设置默认图像和突出显示的图像。为此,我下载数据并将其保存到文件中,每当需要图像时,我就从文件中创建BitmapDrawable,并将其放入StateListDrawable中。当不再需要ImageView时,如何才能正确地释放StateListDrawable,这样我就不会泄漏内存,它们就会被垃圾收集起来?我是否应该在StateListDrawable中保存对每个StateListDrawable的引用,以便对它们调用循环?如何将StateListDrawable回调设置为null?还是将ImageView设置为空到不泄漏内存?
谢谢!
发布于 2012-05-27 00:09:58
Java将自动负责收集您不需要的StateListDrawable,您所要做的就是确保无法从程序中引用StateListDrawable本身,方法是将引用重新分配到另一个Object,或者设置对null的引用。即使StateListDrawable仍然保存对您希望保留的其他对象的引用(例如您讨论过的回调),...once a Object也不重要,它有资格进行垃圾收集。当VM认为是释放内存的好时机时,它将负责为您删除StateListDrawable,您不需要担心自己对任何对象调用recycle()。
如果您正在使用Eclipse进行编辑,查看这一点的一个简单方法是在程序运行于模拟器中时查看LogCat消息。偶尔会有这样的消息:"GC释放xxx对象/ xxx字节( xxx Ms)“。
来自Java教程:
“一些面向对象的语言要求您跟踪所创建的所有对象,并在不再需要时显式地销毁它们。Java平台允许您创建任意数量的对象(当然,这取决于您的系统所能处理的是什么),您不必担心销毁它们。当Java运行时环境确定对象不再被使用时,它会删除这些对象。这个过程称为垃圾收集。 当不再有对对象的引用时,对象有资格进行垃圾收集。当变量超出作用域时,保存在变量中的引用通常被删除。或者,通过将变量设置为特殊值null,可以显式地删除对象引用。请记住,程序可以有多个对同一个对象的引用;在对象符合垃圾收集条件之前,必须删除对对象的所有引用。“
编辑:来自文档的‘Bitmap.recycle()’,
“释放与此位图关联的本机对象,并清除对像素data...This的引用是一个高级调用,通常不需要调用,因为当不再有对此位图的引用时,正常的GC进程将释放此内存。”
https://stackoverflow.com/questions/6284038
复制相似问题