我一直在阅读有关解码位图的性能问题,并收到 OutOfMemoryError“位图超出 VM 预算”的问题,而我希望不会内存不足并在线阅读这是一个常见问题,称为错误许多开发者的框架。
通常,我在第二次通过时会遇到上述错误。假设我成功加载了一个相当大的位图,然后回收它,甚至将 ref 设置为 null。当我第二次调用相同的方法将我的位图加载到内存中时...崩溃。
我在这里和其他地方的在线帖子中读到,有几件事可以用 BitmapFactory.Options 完成(例如,显式提供输入缓冲区)。但是,在盲目地使用我所发现的内容之前,我希望对这些类有更多了解的人可以提供更多的信息。
显式地向 BitmapFactory.Options.inTempStorage 提供字节数组与在编码过程中如果没有它 BitmapFactory 会做什么之间有什么区别?为什么这会/应该有助于解决 OutOfMemoryError?它是否提供比默认缓冲区更小的缓冲区,因此在内存耗尽之前有更多机会进行清理?
当我调用 Bitmap.recycle() 时具体发生了什么,为什么它与将 Bitmap 设置为 null 不同?注意:执行其中一项或两项操作对我是否(以及何时)出现 OutOfMemory 错误没有影响。
有没有什么时候我应该明确邀请 GC 参与处理这类问题?我一直(在 Java 和 .Net 中)都假设 GC 在大多数情况下应该被信任来决定它在何时何地执行它的操作,因为收集的后果不仅仅是释放内存(而且我个人对它们的了解还不足以做出那个决定)。
更新:
这个视频回答了我的大部分问题:
Google I/O 2011:Android 应用的内存管理
最佳答案
我发现这可能很有趣:http://osdir.com/ml/AndroidDevelopers/2009-08/msg01230.html .您是否尝试过 System.gc() 来确认它来自未正确清理 native 堆的问题?
关于java - 关于Android中BitmapFactory.Options的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4105800/