我正在创建一个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流程将释放此
  当不再有对该位图的引用时,内存。”

07-26 09:39