首先,确保您没有加载比需要更大的位图:
Load a Scaled Down Version into Memory。
然后,在尝试之前largeHeap
,尝试自己快速释放内存:
如果您bitmap.recycle();
一确定就不会再使用位图,则立即调用,则该位图的大部分内存将立即被释放。(当 GC 处理它时,剩下的只是一个小对象。)
在较新的 Android 版本上,有recycle
可能更有效的替代方法(而不是 ):
管理位图内存
就个人而言,我仍然经常使用,特别是如果我可能正在加载不同尺寸的图像,那么现有的recycle
就不能。reuse
此外,当更改为不同的片段或活动时,我发现将旧媒体的“卸载”与新媒体的“加载”分开编码更容易:
离开旧片段,所有旧位图 I recycle
(然后,如果可以从静态字段,设置为null
)。
是否使用 , 的经验法则是在您尝试了减少内存使用的替代方法后largeHeap
考虑它。
对您的应用程序进行编码,以便您可以再次将其关闭,并且仍然可以运行。
例如,监控您的内存使用情况,并在内存紧张时加载“按比例缩小”的位图。如果给定的图像不是他们设备的“视网膜”分辨率,用户真的会注意到吗?
或者,如果它是一个较旧、较慢的设备,largeHeap 是否会让您的应用程序感觉无响应/生涩?如果是这样,您能否进一步降低分辨率,或者一次显示更少的位图?
让您的应用在任何情况下都能正常工作,而无需 largeHeap
[通过上述技术]。注意:您可以通过分配一些“虚拟”位图来“强制测试”在紧张的内存上运行,并在全局字段中保存对它们的引用,这样它们就不会被释放。
现在您可以评估权衡,因为它会影响您的应用程序:
当您打开largeHeap
时,请大量使用您的应用程序 - 是否现在它“更迟钝”,或者动画“口吃”或其他看起来不太流畅的地方?请务必在至少一台较旧的设备和一台 HIGH_RESOLUTION 设备上进行测试。由于堆较大,您可能会看到较长的 GC 时间。
或者,您可能会得出结论,这largeHeap
对您来说效果很好,现在您可以自信地说它是您所处环境的最佳选择。