Android 图片与内存消耗

在Android应用开发中,图片可以算消耗内存的大户。跟图片消耗内存有关的因素有这么几个方面:

  • 图片资源的分辨率
  • 设备屏幕的分辨率
  • 加载图片所用的编码方式

加载图片到内存,占内存的大小等于 图片长height * 宽width * 每个像素点所占的字节。比如一块分辨率800 * 600的图片,采用ARGB_8888的编码方式来加载图片。那么占用的内存是800 * 600 * 4 = 1920000Byte,也就是1.9M内存,大概2M的内存。

注意:有时候会遇到你通过Android Device Monitor检测到的占用内存比你的通过上述方式计算出来的大小大很多,这很有可能是因为你存放图片的drawable文件夹和你的测试机不匹配

Android应用里面有这么几种drawable文件夹,分别用来存放不同的dpi设备对应的图片资源,这几种drawable文件夹和dpi的对应关系如下:

  • drawable-ldpi (low) ~ 120dpi
  • drawable-mdpi (medium) ~ 160dpi
  • drawable-hdpi (high) ~ 240dpi
  • drawable-xhdpi (extra-high) ~ 320dpi
  • drawable-xxhdpi (extra-extra-high) ~ 480dpi
  • drawable-xxxhdpi (extra-extra-extra-high) ~ 640dpi

当你新建一个Android project的时候,系统会自动为你生成一个不带后缀的默认drawable文件夹,相当于drawable-mdpi。如果你需要别的类型的drawable 文件夹,需要自己手动新建。当你的app没有运行的设备对应的图片资源,那么它就会搜索别的最接近的drawable文件夹,并会把相应的图片资源拓展或者压缩成设备需要的图片资源。例如你只在drawable文件夹里面有图片资源,而运行的设备的dpi大于160,那么它就会把该文件夹下的图片拓展来加载。

如果你把图片是800 * 600的分辨率,放在默认的drawable文件夹,而这个文件夹对应的是dpi为160的设备,而现在很多设备的dpi远比这个大,比如我用的测试机就是dpi为480。那么app就会自动把该图片拓展为三倍(480 / 160 = 3)记载到内存中,本来这个图片占用的运行内存应该为1.9M。但当图片扩展后它所占用的内存是:(800 * 3) * (600 * 3) * 4 = 17280000 = 17.28M。是原来的将近10倍。一个图片就占用这么多内存,后果是很严重的。所以在处理这一块的时候应该特别小心。

如何知道自己手机的dpi呢?

可以通过下面这段代码获取手机的dpi:

 DisplayMetrics metrics = getResources().getDisplayMetrics();
 int densityDpi = (int) (metrics.density * 160f);
 Toast.makeText(this, "densityDpi: " + densityDpi, Toast.LENGTH_LONG).show();

你可能感兴趣的:(android)