博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android关于加载大图片,产生OOM问题
阅读量:4099 次
发布时间:2019-05-25

本文共 2043 字,大约阅读时间需要 6 分钟。

什么是OOM?

OOM,是OutOfMemory的缩写,翻译过来就是内存溢出。原因是:分配的太少;用的太多;用完没释放。

内存用完没有被释放–>内存泄漏,大量的内存泄漏就导致OOM.
android 在没有利用框架去网络请求加载大图片,容易产生OOM.

java.lang.RuntimeException: Canvas: trying to draw too large(117608400bytes) bitmap.        at android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:260)        at android.graphics.Canvas.drawBitmap(Canvas.java:1415)

避免OOM

思路:第一次读取图片,不写入内存,直接获取到图片的宽高,再通过用户设置的控件的宽高,和这個拉伸形式來计算期望的宽高,结合这四個参数來找出最适合的采样率,或者直接根据屏幕大小,控件大小來计算最佳采样率。

什么是采样率?
当采样率为1时,就相当于去下载高清无码原图,如果为3,那么采样率近似于原图的1/3,图片大小也会减小到原来的1/3.
如果我们把采样率写死的话–>BitmapFactory.Options options = new BitmapFactory.Options();options.inSampleSize = 10;容易得到下载的图片成AV画质,所以我们下面要学习动态计算采样率,下载图片:

public void getBigImage(View view) {
ImageView imageView = this.findViewById(R.id.image_container); BitmapFactory.Options options = new BitmapFactory.Options(); //设置为true以后呢,不是真的载入到内存中,只是获取到图片的相关信息 options.inJustDecodeBounds = true; BitmapFactory.decodeResource(getResources(),R.mipmap.test_pic,options); int width = options.outWidth; int height = options.outHeight; int measuredWidth = imageView.getMeasuredWidth(); int measuredHeight = imageView.getMeasuredHeight(); Log.d(TAG,"width -- > " + width + " measure width -- > " + measuredWidth); Log.d(TAG,"height -- > " + height + " measure height -- > " + measuredHeight); int sampleSize; if(width < measuredWidth || height < measuredHeight) {
sampleSize = 1; } else {
int subHeight = width / measuredWidth; int subWidth = height / measuredHeight; sampleSize = subHeight > subWidth ? subHeight : subWidth ; } Log.d(TAG,"sampleSize -- > " + sampleSize); options.inSampleSize = sampleSize; //变成false了,真的存入内存 options.inJustDecodeBounds = false; Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.test_pic,options); imageView.setImageBitmap(bitmap); }

关于图片加载的思路可以去看Volley或okhttp的源码!!!

参考: 阳光沙滩——>拉大锯

转载地址:http://dhrii.baihongyu.com/

你可能感兴趣的文章
NEXO代币持有者获得20,428,359.89美元股息
查看>>
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
Wipro加入世界经济论坛“新型工作标准伙伴关系”倡议
查看>>
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
巴西试点全球首个采用面部识别技术的穿梭航班服务
查看>>
Bentley 软件公司完成对全球领先的地球科学三维建模软件提供商 Seequent 的收购
查看>>
Pattern Computer研制出高准确度新冠肺炎检测系统,15秒可出结果
查看>>
东芝董事长发布致股东公开信
查看>>
zooom Productions选择Esri的ArcGIS Platform,打造红牛X-Alps穿越赛实时跟踪应用
查看>>
由EIG牵头的财团与沙特阿美达成124亿美元的基础设施交易
查看>>
法拉利选择AWS作为其官方云提供商,助力公路和赛道创新
查看>>
泰雷兹为物联网连接带来变革,以“即开即用”的方式连接至全球任意蜂窝网络
查看>>
ABLIC推出业界超小型(*1)车载用高侧开关S-19682/3系列 具摄像头/天线连接诊断功能
查看>>
Elliptic Labs与博世旗下的Grow平台签署许可协议
查看>>
沙迦表彰肯尼亚人道主义机构RefuSHE在儿童和女童难民救助方面所做的开拓性贡献
查看>>
MulteFire Alliance (MFA)简化企业5G专用网络的部署途径
查看>>
希尔顿旗下多家品牌酒店重返拉斯维加斯,通过快速扩张加倍押注赌城未来
查看>>
乐高®跨界联动全新百老汇音乐剧,隆重揭幕纽约第五大道最新创意门店
查看>>
Zain Iraq通过MATRIXX Software推出突破性数字品牌oodi
查看>>
NetApp收购Data Mechanics,将加速Spot发展并优化云端数据分析和机器学习工作负载
查看>>