清理StateListDrawable

时间:2011-06-08 19:21:58

标签: android garbage-collection imageview out-of-memory

我正在创建一个Android应用程序,可以从互联网动态下载图像,然后将它们放到ImageView上,允许用户设置默认图像和突出显示的图像。为此,我下载数据并将其保存到文件中,每当需要图像时,我都会从文件中创建BitmapDrawable并将其放在StateListDrawable中。当不再需要ImageView时,处理StateListDrawable的正确方法是什么,所以我不会泄漏内存并且他们会收集垃圾?我应该保留BitmapDrawable中每个StateListDrawable的引用,以便我可以对它们进行回收吗?将StateListDrawable回调设置为null怎么样?或者将ImageView设置为null以使内存不泄漏?

谢谢!

1 个答案:

答案 0 :(得分:2)

Java VM将自动负责收集您不想要的StateListDrawable。您所要做的就是确保无法通过将引用重新分配给另一个StateListDrawable或将引用设置为Object来从您的​​程序中引用null本身。 。如果StateListDrawable仍然保留对您想要保留的其他对象的引用(例如您讨论的回调),则无关紧要......一旦Object无法引用,它就有资格获得垃圾采集。当VM认为是释放内存的好时机时,它会为您删除StateListDrawable,您不必担心自己在任何对象上调用recycle()。 / p>

如果使用Eclipse进行编辑,查看此内容的一种简单方法是在程序在模拟器中运行时查看LogCat消息。偶尔会有消息说:“GC在xxx ms中释放xxx对象/ xxx字节。”

来自Java tutorials

  

“某些面向对象的语言要求您跟踪所有内容   您创建的对象以及在它们存在时显式销毁它们的对象   不再需要。 Java平台允许您创建尽可能多的   你想要的对象(当然,有限的,你的系统可以   处理),你不必担心摧毁它们。 Java   运行时环境在确定对象时删除它们   不再使用。此过程称为垃圾回收。

     

当没有更多对象时,该对象有资格进行垃圾回收   对该对象的引用。变量中包含的引用是   当变量超出范围时通常会丢弃。或者,你可以   通过将变量设置为显式删除对象引用   特殊值null。请记住,程序可以有多个   引用同一个对象;所有对象的引用必须是   在对象符合垃圾收集资格之前删除。“

编辑:来自documentation的'Bitmap.recycle()`,

  

“释放与此位图关联的本机对象,并清除   参考像素数据...这是一个高级调用,通常   不需要调用,因为正常的GC过程将释放它   没有更多对此位图的引用时的内存。“