【发布时间】:2011-01-18 15:55:22
【问题描述】:
我正在编写一个图像处理工具,出于图像质量的原因,我希望将图像编辑为尽可能大的尺寸。
我需要小心,不要在我的应用程序运行时耗尽内存。此外,我想利用具有大量内存的设备。例如,我想在 G1 等功能较弱的设备上支持中等尺寸的图像,而让三星 Galaxy S 等功能更强大的设备支持大图像。
是否有可靠的方法来衡量我的应用可以使用多少内存?
我目前的想法是,在决定要加载的图像大小时,设备可以计算使应用程序的内存使用率尽可能接近 70% 的图像大小(即不是 100%,因为你没有希望应用程序稍后在小分配时崩溃或由于内存碎片)
我发现我可以使用以下代码返回可用内存的百分比:
double totalMemoryUsed = (Runtime.getRuntime().totalMemory() + android.os.Debug.getNativeHeapAllocatedSize());
int percentUsed = (int)(totalMemoryUsed / Runtime.getRuntime().maxMemory() * 100);
新位图添加到本机堆分配部分。这似乎是可靠的,因为当 percentUsed 超过 100% 时,我的应用程序会因内存不足错误而崩溃。我需要注意上述计算的任何注意事项吗?
【问题讨论】:
-
我会担心的是一切正常,然后 android 不明智地决定恢复以前资源被杀死的后台进程并导致您的应用程序因此崩溃。
-
你的计算对我来说没有意义。恕我直言,您应该使用
Runtime.freeMemory()和Runtime.totalMemory()的组合。如果您使用的是 Debug.getNativeHeapAllocatedSize(),您可能会计算两次,请参阅stackoverflow.com/questions/1945142/bitmaps-in-android/… 澄清 Runtime.totalMemory() 是您的程序可用的数量,而 maxMemory() 是 VM 可用的数量。
标签: java android image-processing mobile