图片OOM问题
android系统进程(app)级别有最大内存限制,跟手机本身运存大小没有关系
超过这个限制就会产生OOM错误
问题的产生
1.一个页面一次加载过多的图片
2.加载大图片没有进行压缩(尺寸,质量)
3.android列表加载大量bitmap没有使用缓存
计算图片占用内存
图片的 宽度 x 高度 x 每个像素点占用内存的大小
从此看出图片存储优化从三个方面考虑(单纯的改变imageview的大小是没有作用的)
1.尺寸压缩
2.质量压缩 使用RGB_565 (2byte) 替代ARGB_8888(4byte)
3.内存重用
public class MainActivity extends AppCompatActivity {
private ImageView imageView,imageView2;
private Bitmap mCurrentBitmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.imageView);
imageView2 = findViewById(R.id.imageView2);
loadImage();
testInBitmap(imageView2);
}
private void loadImage() {
mCurrentBitmap = BitmapFactory.decodeResource(this.getResources(),R.mipmap.mee);
imageView.setImageBitmap(mCurrentBitmap);
}
//压缩图片
void picOptimize(ImageView imageView){
//获取options
BitmapFactory.Options options = new BitmapFactory.Options();
//在不加载图片到内存的情况下获取图片宽和高
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(this.getResources(),R.mipmap.mee,options);
//获取图片的宽和高,修改比例
int width = options.outWidth;
options.inSampleSize = width / 20;
//修改图片像素点
options.inPreferredConfig = Bitmap.Config.RGB_565;
//真正加载图片
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(),R.mipmap.mee,options);
imageView2.setImageBitmap(bitmap);
}
//图片缓存inBitmap的使用
void testInBitmap(ImageView imageView2){
BitmapFactory.Options options = new BitmapFactory.Options();
options.inBitmap = mCurrentBitmap;
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(),R.mipmap.mee,options);
imageView2.setImageBitmap(bitmap );
}
}
//optiions的常用方法,获取图片的宽高mime 但并没有真正的将图片加载到内存,以节省空间,处理完成后再加载到内存
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;
注意点:使用InBitmap的时候,后面的图片要小于等于第一张图片大小的内存。
3.0之前,对于像素数据的支持保存在本地内存中,要自己释放
3.0之后,像素数据和位图都存储在 Dalvik堆中,垃圾处理器会自动回收。
mipmap
是一种提高图片渲染质量和速度的技术
将图片资源放入mipmap中后,会默认使用 setHasMipMap = true 默认开启mipmap
google 启动图片加入 mipmap 其他资源图片依然保存在drawable中
分辨率和DPI
分辨率是指屏幕上像素个数(单位:ps)
DPI每英寸屏幕上的像素个数
早起为每一种dpi都出一套图片资源(缺点是占用涉及资源)
方案改进:
提供一套你需要支持的最大dpi的图片
自动渲染
内存占用与drawable文件夹的关系
同一张图片放在不同目录下,会生成不同大小的bitmap