0. 概念
图片占用的内存:图片高度 * 图片宽度 * 一个像素占用的内存大小这个公式代表一个图片最终占用的内存大小,项目中的优化图片占用内存都是通过这个三个参数来优化的。
1. 方法
图片宽高优化
- Drawable代替图片,最简单直接的方法,能用Drawable的尽量用,比如纯色、圆角、渐变、椭圆、边框等
- 尽量用小图片代替大图片(业务同意的情况下),这个可以直接显著的降低内存
- 用.9.png格式的图片,既能降低apk大小,还能降低内存的占用,而且能完美适配机型
- 图片的存放目录和手机的屏幕密度影响图片最终的大小
因为他们是通过改变图片的宽高来影响大小的,200*200大小的图片放到不同的目录下(xhdpi等),手机加载到内存中的宽高是不一样的,android会对图片进行拉升跟压缩 - 用BitmapFactory.Options中的inSampleSize变量来减少加载到内存中的图片大小
一个像素占用的内存大小
- 降低图片色彩质量,在不影响视觉的情况下使用该方法,修改Android的BitmapConfig类中的属性
RGB888(int):R、G、B分量各占8位
RGB565(short):R、G、B分量分别占5、6、5位
RGB555(short):RGB分量都用5位表示(剩下的1位不用)
ARGB8888(int):A、R、G、B分量各占8位
ARGB4444(short):A、R、G、B分量各占4位
其他
- 异步加载、缓存、尽快是否资源等都是必须的,但是项目中用了glide都封装好了。
2. Bitmap
- 内存模型
Android 2.3.3(API10)之前,Bitmap的像素数据存放在Native内存,而Bitmap对象本身则存放在Dalvik Heap中,而在Android3.0之后,Bitmap的像素数据也被放在了Dalvik Heap中。 - 内存回收
Android3.0之前,强调recycle(),之后强调Bitmap的复用。
因为Android3.0之前不支持了跳过,主要说下复用:
- Android3.0(API 11之后)引入了BitmapFactory.Options.inBitmap字段,设置此字段之后解码方法会尝试复用一张存在的Bitmap。这意味着Bitmap的内存被复用,避免了内存的回收及申请过程,显然性能表现更佳。
- Android4.4(API 19)之前待加载Bitmap的Options.inSampleSize必须明确指定为1
- Android4.4(API 19)之后被复用的Bitmap的内存必须大于需要申请内存的Bitmap的内存
if(bitmap != null && !bitmap.isRecycled()){
bitmap.recycle();
bitmap = null;
}
Bitmap.recycle();释放了图片的资源;Bitmap=null;将Bitmap赋空,让有向图断掉,好让GC回收
一定要确保没有再用到此bitmap
3. 项目中切了几套图
项目中切了一套1920x1080图用于适配,个别图片切了两套图片
网友评论