Bitmap复用
Bitmap decode
- 常见的jpg,png,webp(Android4.2才开始支持)是图像的存储格式
- Android中要显示图片必须先经过解码(decode)读取图像的数据到内存中
- BitmapFactory提供了常用的一些decode方法
- 图片真正占用的内存大小要看decode之后的数据大小
Bitmap memory
- <=2.3.3(api 10)
BItmap解码之后 的数据存储在Native Memory中
手动调用Recycle回收 - 》=3.0
Bitmap解码之后的数据存储在Dalyik heap(Java)中
Dalvik自动回收
Re-using Bitmaps
- 对象池(Object Pool)---相同的对象会互斥使用同一块内存空间
mBitmapOptions.inBitmap=mCurrentBitmap;
mCurrentBitmap=BitmapFactory.decodeFile(filename,
mBitmapOptions) - 建立多个对象池
第三方库----glide
预压缩Bitmap
createScaledBitmap(inBmp,64,128)---加载后缩放Bitmap到给定的宽高
mBitmapOption.inSampleSize=4;// 会把采样率变成最接近2的N次方的值
mCurrentBitmap=BitmapFactory.decodeFile(fileName,
mBitmapOptions);
查看原始的宽高
.inJustDecodeBounds=true;
减少占用字节
png--比较高质量的图像
ARGB_8888 每个像素占4字节(图像质量最高,支持透明度)
RGB_565 每个像素占2字节(缩略图,不支持透明度)
ARGB_4444 每个像素占2字节(缩略图,支持透明度)
ALPHA_8 每个像素占1字节
图标类节约内存:ALPHA_8+Color tint
节约COU:ARGB_8888
** Android默认都是以ARGB_8888解码的**
jpg --在Android中也是四个字节
开发中注意压缩PNG文件的大小
Script PNG
如不支持透明度,可以选择JPG格式的文件
- 推荐web-p的文件
LRU cache(实现对象池)
当需要删除缓存时会替换掉那些不经常使用的缓存
Bitmap bmpToDraw=mCahe.get(filename);
if(bmptToDraw ==null){
bmpToDraw=BitmapFactory.decodeFile(filename);
mCache.put(filename,bmpToDraw);//将Bitmap对象加入对象池
}