Diff b/w bitmap.recycle()和bitmap = null

And*_*lva 9 android bitmap out-of-memory

我处于这样一种情况,我使用for循环下载一组图像,我将其转换为位图图像.所以为了避免OutOfMemory错误,我试图回收位图.但不幸的是,我遇到了另一个例外情况"View trying to use a recycled bitmap".

但我仍然可以通过使用来取消使用的位图bitmap=null.所以我的问题是,我的位图会null帮助我释放已用过的内存吗?或者我应该提供bitmap.recycle()我的代码的其他部分?

nic*_*ild 8

没有保证强制垃圾收集的方法,只能建议使用垃圾收集System.gc().由于位图像素数据位于dalvik堆之外的本机内存中,因此提供本机函数(在本例中recycle())将使我们有机会清除(最终)此像素数据.请注意,使用时recycle(),您可以使用该位图做更多的事情.

您遇到的问题是您正在调用recycle()一个您仍在尝试使用的位图.

要回答你的问题,是的,在你回收它之后将位图设置为null是一个好主意,但它也可能是多余的.完成后,请务必尝试回收位图.

  • `当你完成它们时,总是尝试回收你的位图.这就是我的问题.我应该在哪里提供回收.如果我尝试在for循环中提供应用程序崩溃.但我想尽可能多地回收利用.那么我在哪里可以准确地使用我的回收方法. (4认同)

Tul*_*x86 7

调用recycle()向系统指示您已完成使用该资源,并且系统现在可以释放它正在使用的非托管内存.一旦以这种方式处理了资源,它的行为通常是未定义的(人们会合理地预期它不再起作用).

之后将引用设置为null有两个好处:

  • 当您尝试使用它们时,您将不会对对象无效
  • 垃圾收集器将知道清理位图对象的托管端,释放更多内存