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