版权声明:本文为博主原创文章,未经博主允许不得转载。
加载大图片会出现:OutOfMemoryError: bitmap size exceeds VM budget
指定每个应大最小的内存堆大小, 超过了该设置值就会报OOM
Android系统对dalvik的vm heapsize作了硬性限制,当java进程申请的java空间超过阈值VMheap时,就会抛出OOM异常(这个阈值可以是48M、24M、16M等,视机型 而定)
;
public class MainActivity extends Activity {
private ImageView mIv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mIv = (ImageView) findViewById(R.id.show_iv);
}
/*
* 加载大图片会出先内存溢出 此时对图片进行压缩
*/
public void loadImg(View view) {
// 1,获取窗体的服务
WindowManager manager = (WindowManager) getSystemService(WINDOW_SERVICE);
Display display = manager.getDefaultDisplay();
// 获取屏幕的大小
int windowW = display.getWidth();
int windowH = display.getHeight();
Log.i("520it", windowW+" "+windowH);
// 获取图片的大小,告诉系统不用加载到内存
File file = new File(getFilesDir(), "largeimage.jpg");
Options opts = new Options();
// 不需要加载到内存
opts.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), opts);
int bitmapW = opts.outWidth;
int bitmapH = opts.outHeight;
// 获取比例,为了保持图片的兼容并且全部显示出来,使用倍数大的比例,进行等值缩放
float scaleW = bitmapW * 1.0f / windowW;
float scaleH = bitmapH * 1.0f / windowH;
float realScale = 0;
if (scaleH > scaleW && scaleH > 1) {
realScale = scaleH;
}
if (scaleW > scaleH && scaleW > 1) {
realScale = scaleW;
}
// 获取到比例后可以加载到内存,
opts.inJustDecodeBounds = false;
opts.inSampleSize = (int) realScale;
Bitmap newMap = BitmapFactory.decodeFile(file.getAbsolutePath(), opts);
// 连续加载 会报内存溢出OutOfMemoryError: bitmap size exceeds VM budget
// Bitmap bitmap=BitmapFactory.decodeFile(file.getAbsolutePath());
mIv.setImageBitmap(newMap);
}
}