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