我决定调查我应用的内存使用情况,然后查看了Android Studio的内存监视器,我的内存使用量大约是68 MB。这对我来说太高了。
我打开了内存分配器并从应用程序的开头开始跟踪。我看到NonMovableArray
分配了49 MB,这是一个Bitmap
。
我调试了应用程序,发现它是我使用的背景。以下行来自PhoneWindow.java
文件,即Android将背景分配给我认为的屏幕。背景对象的大小为 49 MB 和2625x4669分辨率。
我的应用程序没有透支,我有一个应用于整个主题的背景。
我在JPG格式的drawable
文件夹中有一个背景可绘制,分辨率为750x1,334。
PhoneWindow.java
if (mBackgroundResource != 0) {
background = getContext().getDrawable(mBackgroundResource);
} else {
background = mBackgroundDrawable;
}
我正在摩托罗拉Nexus 6设备上进行测试,该设备密度为560,分辨率为1440 x 2560.
有两点我不明白。
如果你们能向我解释一下那会很棒。谢谢!
答案 0 :(得分:5)
如果设备的分辨率为1440x2560,为什么我的背景会转换为2625x4669?
您将图片放入res/drawable/
。这不是一个好的选择,因为它是res/drawable-mdpi/
的同义词。因此,Android正在重新采样您的图像,认为您的目标是-mdpi
设备(~160dpi),因此图像与Nexus 6上的物理尺寸大致相同(3.5倍密度)。
res/drawable-nodpi/
或res/drawable-anydpi/
是否是正确的选择取决于您对此资源的替代版本,either will probably work。
如何将160 KB文件最终变为49 MB?
图像在磁盘上占用160KB 。内存占用是解码图像。这将是ARGB_8888
图像的图像分辨率(重新采样后)乘以4字节/像素。 2625x4669x4~ = 49MB。
答案 1 :(得分:1)
Bitmap
的默认和最高质量配置为ARGB_8888
,每个像素使用4个字节。由于您的图像缩放到2625 * 4669,那就是:
2625*4669*4 bytes = 49024500 bytes
http://developer.android.com/reference/android/graphics/Bitmap.Config.html
答案 2 :(得分:0)
我不确定分辨率差异,但使用的内存与文件大小之间的差异是因为 JPG 格式的图像(与许多其他格式一样)是压缩(请参阅wiki了解如何)。当您将其加载到内存中时,它不再被压缩,因为它用于绘制屏幕上的每个像素。