OOM 为 out of memory 的缩写 也就是常见的内存溢出
一般在大图片加载时经常会出现内存溢出的情况 比如一张3000*2029像素的图片
如果按照ARGB8888的格式 每一个pixel 占 4个byte 其中每一个字节用于存储A(透明)R(红色)G(绿色)B(蓝色)对应的0-255的取值
而一张3000*2029的图片如果要加载到内存就需要用 3000*2029*4 = 24348000byte = 23M的运行内存
而这样不做任何处理的加载操作很有可能会导致OOM
下面贴出一段会报OOM异常的代码并附上导致OOM的高清图
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.xxx,opts);
imageView.setImageBitmap(bitmap);
接下来提供解决方案 android 系统本身针对这种情况已经给出了解决方案 ---这里介绍的是其中一种 实际中应当结合多种方案防止OOM问题
BitmapFactory.Options 是android 提供的类 这个的意义就是 图片的参数类 在解析图片时将该参数传入 图片就会按照参数进行解析
BitmapFactory.Options 又一个属性是opts.inSampleSize 是设置图片的缩放比例 我们可以通过代码对其赋值 比如赋值为4 官方文档上说明是 会将改图片的宽高各缩小4倍
然后返回一个只有未作处理前图片大小的1/16的大小的图片 但是实际情况并不一定会按照这个比例 缩放 比如
S4 inSampleSize = 4 3000*2029 ---> 1000*677pixel 2708000 byte =2.58m
NOTE3 inSampleSize = 4 3000*2029 ---> 1500*1016 pixel 6096000 byte = 5.8m
但是肯定是会对图片进行缩放 从而达到缩小图片的目的 至于为何不是按照比例所放的愿意暂时还不清楚如果有明白的大牛麻烦讲解下
下面贴出解决代码:
//图片参数选项
BitmapFactory.Options opts = new BitmapFactory.Options();
//设置不真正去解析位图 只是获取位图信息
opts.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.drawable.xxx, opts);
int windowH = getResources().getDisplayMetrics().heightPixels;
int windowW = getResources().getDisplayMetrics().widthPixels;
//根据窗口宽高 和 图片宽高 计算出缩放比例
int scaleX = opts.outHeight / windowH;
int scaleY = opts.outWidth / windowW;
int scale = 1;
//获取差值最大的一个 进行缩放
if(scaleX > scaleY && scaleX>1) {
scale = scaleX;
}
if(scaleY > scaleX && scaleY>=1) {
scale = scaleY;
}
//设置为false才能真正去解析位图
opts.inJustDecodeBounds = false;
//设置图片的缩放比例 如果为4则将图片缩16倍 实际并非如此
opts.inSampleSize = 4;
//根据opts的缩放大小对图像进行缩放 这样就不会造成OOM了
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.xxx,opts);
imageView.setImageBitmap(bitmap);
这是解决OOM的一种最基本的方法 其他的方法如软引用 结合使用最佳