Android基础之加载大图片

版权声明:本文为博主原创文章,未经博主允许不得转载。

加载大图片会出现: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);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值