根据Bitmap.recycle()
的Android参考文档:
释放与此位图关联的本机对象,然后清除 参考像素数据。这不会释放像素数据 同步;它只是允许它被垃圾收集,如果有的话 没有其他参考。位图标记为“死”,意思是它 如果调用getPixels()或setPixels(),则会抛出异常 什么都不会。这个操作无法逆转,所以应该如此 只有在你确定没有进一步的用途时才被调用 位图。 这是一个高级调用,通常不需要调用, 因为正常的GC过程会在没有时释放这个内存 更多对此位图的引用。
但是,我读过的很多书都建议通过调用Bitmap.recycle()来释放内存,确保不再需要它。
让我感到困惑:使用后是否需要拨打Bitmap.recycle()
?
答案 0 :(得分:18)
取决于。
如果您在Android 3.0及更高版本上运行应用程序,则不需要它,因为GC会完美地处理它。
但是,如果您在旧版本上运行您的应用程序,因为GC无法很好地监控位图(它认为它们是参考的大小),您可以获得OOM,如Google IO讲座所示{{ 3}}
在任何情况下,仍然建议您在确定不再需要位图时立即调用回收。它甚至适用于新的Android版本,因为它降低了自动内存管理所需的工作......
事实上,我记得我曾问过类似的问题here。
此外,如果您需要使用JNI进行额外的位图控制,请查看here。
因此,简而言之,答案是不再需要它,但仍然建议。
答案 1 :(得分:1)
没有必要,但强烈推荐!它将加速内存释放过程,并在内存不足的情况下为您节省酷刑。
如果你要对Bitmaps进行任何严肃的记忆工作,我会说这是强制性的。
答案 2 :(得分:0)
之前的Android 3.0 Bitmaps会分配本机内存来存储它的像素,而recycle()会调用该区域中的delete。
即便如此,如果仍有任何参考,GC也不能保证释放内存。
但这个调用看起来有助于GC更好地工作,我开发了一个应用程序,它可以广泛使用内存并在较新的设备上运行,调用或不运行应用程序运行几乎相同(对于较旧的,它确实提高了一些性能)。
答案 3 :(得分:0)
根据我的经验,我们在生产代码中运行了沉重的位图压缩,并且在没有调用recycle()
的情况下,在旧的Lollypop
设备中遇到了许多OOM异常,然后将其添加到代码中, OOM的百分比显着降低。