android报错及解决1--Bitmap加载时,报bitmap size exceeds VM budget
报错描述:
用Bitmap加载图片资源时,报错java.lang.OutOfMemoryError: bitmap size exceeds VM budget
原因分析:
android系统限制,只给图片分配8M内存,超过就蹦。图片虽然几十K,可能是压缩格式,转换成BitMap就是本来大小
解决办法:
1、Android模拟器在设置时可以将Max VM application heap size值设大一点,我这里默认是16,改到60
2、图形对象优化,这里要说的是Android上的Bitmap对象销毁,可以借助recycle()方法显示让GC回收一个Bitmap对象,
通常对一个不 用的Bitmap可以使用下面的方式,如
1 if(bitmapObject.isRecycled()==false) //如果没有回收 2 bitmapObject.recycle();
延伸学习:
设置恰当的inSampleSize可以使BitmapFactory分配更少的空间以消除该错误,我们要将图片按照固定大小取缩略图,一般取缩略图的方法是使用 BitmapFactory的decodeFile方法,然后通过传递进去 BitmapFactory.Option类型的参数进行取缩略图,在Option中,属性值inSampleSize表示缩略图大小为原始图片大小的几分之一,即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4
1 BitmapFactory.Options opts = new BitmapFactory.Options(); 2 opts.inSampleSize = 4 ; 3 Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);
然而,如果我们想取固定大小的缩略图就比较困难了,比如,我们想将不同大小的图片去出来的缩略图高度都为200px,而且要保证图片不失真,那怎么办?我们总不能将原始图片加载到内存中再进行缩放处理吧,要知道在移动开发中,内存是相当宝贵的,而且一张100K的图片,加载完所占用的内存何止 100K?
可以通过设置Options中有个属性inJustDecodeBounds来处理,如果该值设为true那么将不返回实际的bitmap不给其分配内存空间而里面只包括一些解码边界信息即图片大小信息,那么相应的方法也就出来了,通过设置inJustDecodeBounds为true,获取到outHeight(图片原始高度)和 outWidth(图片的原始宽度),然后计算一个inSampleSize(缩放值),然后就可以取图片了,这里要注意的是,inSampleSize 可能小于0,必须做判断。
1 BitmapFactory.Options options = new BitmapFactory.Options(); 2 options.inJustDecodeBounds = true; 3 // 获取这个图片的宽和高 4 Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/test.jpg", options); //此时返回bm为空 5 options.inJustDecodeBounds = false; 6 //计算缩放比 7 int be = (int)(options.outHeight / (float)200); 8 if (be <= 0) 9 be = 1; 10 options.inSampleSize = be; 11 //重新读入图片,注意这次要把options.inJustDecodeBounds 设为 false哦 12 bitmap=BitmapFactory.decodeFile("/sdcard/test.jpg",options); 13 int w = bitmap.getWidth(); 14 int h = bitmap.getHeight(); 15 System.out.println(w+" "+h); 16 ImageView iv=new ImageView(this); 17 iv.setImageBitmap(bitmap);
这样我们就可以读取较大的图片而不会内存溢出了。
转载于:https://www.cnblogs.com/aiguozhe/p/3574595.html
android报错及解决1--Bitmap加载时,报bitmap size exceeds VM budget相关推荐
- ueditor上传图片回调_(常见解决方法)UEditor报错“后端配置项没有正常加载,上传插件不能正常使用”...
(常见解决方法)UEditor报错"后端配置项没有正常加载,上传插件不能正常使用"_向来萧瑟也无畏-CSDN博客blog.csdn.net 报错信息 详见此文的"排错过 ...
- hp laser103 属性没有配置项_(常见解决方法)UEditor报错“后端配置项没有正常加载,上传插件不能正常使用”...
(常见解决方法)UEditor报错"后端配置项没有正常加载,上传插件不能正常使用"_向来萧瑟也无畏-CSDN博客blog.csdn.net 报错信息 详见此文的"排错过 ...
- 转载 Android解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
当图片过大,或图片数量较多时使用BitmapFactory解码图片会出java.lang.OutOfMemoryError: bitmap size exceeds VM budget,要想正常使用则 ...
- 完美解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
转自http://www.maxhis.info/androiding/bitmap-size-exceed/ 当图片过大,或图片数量较多时使用BitmapFactory解码图片会出java.lang ...
- 【Python技巧】(虚拟环境报错、pycharm)无法加载文件 ...\venv\Scripts\activate.ps1,因为在此系统上禁止运行脚本。
一.问题出现: 使用Pycharm设置虚拟环境后,打开终端出现如下报错: 无法加载文件-\venv\Scripts\activate.ps1,因为在此系统上禁止运行脚本. 二.解决方式 已管理员的身份 ...
- pom文件报错_解决mac下tess4j文字识别报错问题
tesseract想必大家都知道(不知道自个查去),tess4j是java对tesseract的封装. Description: A Java JNA wrapper for Tesseract OC ...
- ? php 为啥报错,如何解决js里面的php代码报错问题
在一个模块中,前端是extjs,后端是php,报错,这是在php的错误警告开到最严格的时候报的错,虽然程序可以跑,可是日志堆积越来越多. Undefined variable:loginUserNam ...
- vue 路由懒加载 报错 Loading chunk * failed 组件加载不出来
跳转对应的路由,无法跳转,打开控制太发现报错,查看网络发现对应的组件没有获取到,而且获取时间只有4ms就停止获取了,谷歌不会报这样的错误,但是edge会, 解决方法(不一定有用):给请求代码套个try ...
- cmd进入dos命令运行java文件报错找不到无法加载类
最近换新电脑之后配置了jdk环境变量之后尝试crm命令运行java文件出现报错,再网上找了些答案,什么java文件里面有语法错误,什么环境变量配置出错,我都尝试了下,发现都没问题,.故而自己做了些测试 ...
最新文章
- Linux网络编程实例分析
- java培训教程分享:Java中用户如何自定义异常?
- AI视觉组基于ESP32的裁判系统第一版本设计要求
- CSS样式----块级元素和行内元素
- 未来CPU内核将更简单!
- java executequery,JDBC中的execute(),executeQuery()和executeUpdate()方法有什么区别?
- 前端学习(2798):实现图片预览的效果
- 虫食算(洛谷-P1092)
- mysql 不用缓存_mysql有自己的缓存机制,为什么还要用redis和memcac? 爱问知识人
- php arsort函数,php-常用函数
- [转]HTTP 错误 403.1 - 禁止访问:执行访问被拒绝。
- Ansys Maxwell三相变压器制作方法教程
- 发送导频信号用到的 matlab function
- PPT处理控件Aspose.Slides功能演示:使用 Java 在 PowerPoint 中创建和操作表格
- 2018.12.26 Jquery 使用 slideBox 实现滚动 效果
- 七牛云图片服务器搭建,对接
- python 006 __ 小斌文档 | 特殊字符的使用
- PIPIOJ1166PIPI的棋盘
- 从源码分析Android的Glide库的图片加载流程及特点
- 休闲游戏合成植物打僵尸源码-H5+安卓+IOS三端源码