【发布时间】:2011-02-22 22:49:42
【问题描述】:
我正在开发一个包含许多图像的应用程序。我注意到 我的应用程序的内存使用量在 Android 2.3 中比在 在 Android 2.2 中 - 最终导致 OutOfMemory 错误,而 加载位图。在研究这个时,我记录了结果 第一个onResume中的Debug.getNativeHeapAllocatedSize() 活动。在 Android 2.2 中,这会输出 5MB。在 Android 2.3 中,这 输出 17MB。
我创建了一个示例应用程序来尝试进一步缩小范围。 示例应用程序有 2 个活动:第一个有一个小图像和一个 按钮启动第二个活动;第二个活动有几个 ScrollView 中的大图像。您可以在此处下载示例: http://dl.dropbox.com/u/21709517/MemoryUsageExample.zip 运行此示例时,Debug.getNativeHeapAllocatedSize() 报告 在 2.2 和 2.3 中开始第一个活动后分配 3MB。 启动第二个activity后,Android 2.2依然报3MB Android 2.3 报告分配了 17MB。运行“亚行 shell dumpsys meminfo test.example" 显示相同类型的结果。
为什么 Android 2.2 和 2.3 之间存在如此巨大的差异? 更重要的是,我应该做些什么不同的事情来防止 在 Android 2.3 上使用这么多内存?
-----更新-----
查看 Romain Guy 发布的信息后,我决定多尝试一下各种加载选项。结果表明,强制将图像加载为 RGB_565 确实会减少 Android 2.3 中的内存,但它仍然使用超过 2.2 的内存。在我的示例应用程序中,Android 2.3 现在使用 10MB,而 Android 2.2 现在使用 3MB。此外,我尝试使用 ARGB_8888 强制 32 位。在这种情况下,Android 2.3 使用 17MB,但 Android 2.2 继续只使用 3MB。可在此处找到更新的示例:http://dl.dropbox.com/u/21709517/MemoryUsageExample2.zip
造成这些差异的原因是什么?是否需要做更多工作才能使内存使用量更接近 Android 2.2?此外,有没有办法将通过 xml 布局创建的图像强制转换为特定格式?这可以在应用程序范围内设置吗?谢谢。
-----更新 2-----
根据this thread,无法强制通过 xml 膨胀加载的图像为特定格式。
我仍然希望得到关于为什么 Android 2.2 和 Android 2.3 在强制 16 位或 32 位后使用不同内存量的答案。
【问题讨论】:
-
这里有些问题,我遇到了同样的问题。 2.3 对我的图像处理应用来说是一场灾难:stackoverflow.com/questions/5871143/…