我一直在阅读有关解码位图的性能问题并收到 OutOfMemoryError “位图超出 VM 预算”问题,当我希望不会出现内存不足并在线阅读时,这是一个常见问题,被称为框架中的错误许多开发人员。
通常,我在第二次通过时收到上述错误。假设我成功加载了一个相当大的位图,然后回收它,甚至将 ref 设置为 null。当我第二次调用这个相同的方法时,它会将我的位图加载到内存中......崩溃。
我在这里和网上其他地方的以前的帖子上读过,有一些事情可以用 BitmapFactory.Options 完成(例如,显式提供输入缓冲区)。但是,在盲目地使用我发现的东西之前,我希望对这些课程有更多了解的人可以提供更多的信息。
显式地向 BitmapFactory.Options.inTempStorage 提供字节数组与在编码过程中没有它时 BitmapFactory 会做什么有什么区别?为什么/应该对 OutOfMemoryError 有所帮助?它是否提供了比默认值更小的缓冲区,因此在内存不足之前有更多的清理机会?
当我调用 Bitmap.recycle() 时具体发生了什么,为什么它与将 Bitmap 设置为 null 不同?注意:做任何一个或两个都不会影响我是否(以及何时)收到 OutOfMemory 错误。
有没有时候我应该明确邀请 GC 参与处理这类问题?我一直在假设 GC 在大多数情况下应该被信任来决定它在何时何地执行它的操作(在 Java 和 .Net 中),因为对集合有更多的后果,而不仅仅是释放内存(而且我个人对它们的了解还不足以做出这个决定)。
更新:
这个视频回答了我的大部分问题:
Google I/O 2011:Android 应用程序的内存管理