加载一张图片到ImageView到底占据多少内存
https://blog.csdn.net/BUG_delete/article/details/79557939
简介
Android中经常要通过ImageView进行图片资源显示。在加载图片时,首先要考虑的两个因素就是体验问题和性能问题。
其中,体验问题是指图片显示的是否正确(例如Universal-Image-Loader在适配Adapter图片资源时会导致图片显示错位),分辨率是否合适等。而体验问题主要是指图片加载速度,以及更加重要的图片加载的内存占用问题。本文重点介绍ImageView加载图片中的内存占用问题。
问题
在开发的过程中,经常会发现因为加载图片而引起的Out of Memory(OOM)问题,有的时候会很奇怪,明明加载的图片只有几十K,为什么就会导致OOM呢?另外在图片资源设置过程中,只放置某一个dpi文件夹(例如drawable-xxhdpi文件夹)的资源,在不同设备中对ImageView占用会有影响吗?下面会对图片加载的内存占用相关问题进行展开分析。
概念描述
首先,图片对内存的占用是一个叠加的过程,也就是说图片资源不是及时释放的,使用过的图片在回收过程中可能会有一定程度的延迟。此外,很多时候图片所依附的Activity是出于当前Activity栈底的状态,再GC回收过程,这样的bitmap资源会被认为是活跃状态的,不会被Android系统回收。
另外一方面,Android中图片加载到内存中的内存占用跟图片的实际大小没有直接的关系,甚至于图片的实际像素尺寸也没有直接的关系。
在这里,首先要介绍几个概念(以图片A:尺寸60*60 大小2.02K为例):
- 图像尺寸:表示图像在硬盘中的原始尺寸,本例中为60*60;
- 图像大小:表示图像在占据硬盘容量大小,本例中为2.02K;
- bitmap尺寸:表示图像以bitmap的形式存在内存中的实际尺寸;
- 显示尺寸:表示图像在UI上显示的实际尺寸;
- 内存占用:表示加载的图片以bitmap的形式在内存中的实际占用。
其中,bitmap尺寸和内存占用可以通过下面的方法得到:
/**** 计算ImageView中加载图片的具体尺寸和内存占用大小* @param imageView*/private void calculateBitmapInfo(ImageView imageView) {Drawable drawable = imageView.getDrawable();if (drawable != null) {BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;Bitmap bitmap = bitmapDrawable.getBitmap();Log.d(TAG, " bitmap width = " + bitmap.getWidth() + " bitmap height = " + bitmap.getHeight());Log.d(TAG, " memory usage = " + bitmap.getAllocationByteCount());/**bitmap.getByteCount()方法不再使用*/} else {Log.d(TAG, "drawable is null!");}}
具体分析
为了明确这个问题,我们做了以下的几组实验对比,具体如下:
实验1
测试方案:将尺寸为图片A(尺寸60 * 60 大小2.02K),图片B(尺寸60 * 60 大小1.63K),将图片均放入drawable-xxhdpi文件夹,图片显示尺寸采用wrap_content,用华为mate 9(xxhdpi)手机进行测试;
测试结果:二者内存占用均为14400Byte,bitmap尺寸为60*60;
结果分析:说明内存占用单独与图片原始大小没有关系。
实验2
测试方案:将将尺寸为图片A(尺寸60 * 60 大小2.02K)放入drawable-xxhdpi文件夹,图片显示尺寸设置为30dp * 30dp和60dp * 60dp,分别用mate 9手机进行测试;
测试结果:内存占用均为14400Byte,bitmap尺寸均为60*60;
结果分析:说明内存占用与图片的实际显示尺寸没有关系。
实验3
测试方案3:将将尺寸为图片A(尺寸60*60 大小2.02K)放入drawable和drawable-xxhdpi文件夹,图片显示尺寸采用wrap_content,分别用mate 9手机进行测试;
测试结果:内存占用分别为129600Byte和14400Byte,图片在ImageView中的bitmap尺寸为180 * 180和60 * 60;
结果分析:说明内存占用与图片的原始尺寸没有关系,与bitmap尺寸有密切的关系。
加载一张图片到ImageView到底占据多少内存相关推荐
- Android Bitmap 全面解析(二)加载多张图片的缓存处理
一般少量图片是很少出现OOM异常的,除非单张图片过~大~ 那么就可以用教程一里面的方法了 通常应用场景是listview列表加载多张图片,为了提高效率一般要缓存一部分图片,这样方便再次查看时能快速显示 ...
- Android测量图像中物体大小,android – 加载图像后测量ImageView
我试图找到一种方法来测量ImageView后使用Glide或Picasso(或其他任何东西)加载图像.基本上,我试图在某些位置在图像顶部布局其他视图,但需要最终的ImageViews尺寸才能准确地完成 ...
- 编辑器如何加载多张图片
只有M1(完整版).M3(拼图)支持加载多张图片 加载多张图片使用xiuxiu.loadPhoto(images,base64,id); 若M1加载多张图片,多加一个固定参数,则使用xiuxiu.lo ...
- android 实现异步加载图片,Android中ImageView异步加载图片类
本源码是从网络找到经修改以方便直接调用感觉用着还可以 首先在项目中添加一个专门加载图片的类AsyncImageLoaderpackage com.demo.core; import java.io.I ...
- 使用SDL加载多张图片(二)
2019独角兽企业重金招聘Python工程师标准>>> http://lazyfoo.net/SDL_tutorials/index.php 这是官网的教程,英语还行的同学可以去看这 ...
- android7.0如何加载本地图片,Android 6.0和7.0 加载同一张图片,结果不同
问题描述 Android6.0和7.0 加载一张jpg图片,转换为bitmap, 然后将其保存到本地,用UE比较两张本地图片的2进制,得到的结果不一致. 问题出现的环境背景及自己尝试过哪些方法 (1) ...
- jvm面试2 jvm如何加载java代码? JVM知识重点:内存模型和GC
jvm如何加载java代码? native方法forName0 JVM知识重点:内存模型和GC' 注意:jvm是一个内存中的虚拟机 下面是Class类中,我们常用的forName方法 @CallerS ...
- android 加载图片进度条,ImageView上的Android进度条
我正在开发一个应用程序,用户将从相机拍摄图片并将其显示在具有图像视图的预览屏幕上. **CameraCapture.java** class ButtonClickHandler implements ...
- IOS多线程 - 使用线程加载一张图片 - NSThread(1)(转)
更新UI的操作在IOS中其实和在Android中是一致的,都是不能在主线程中执行比较耗时的操作,所以需要开启新线程去做这些操作,以免阻塞主线程,当新线程中的操作完成之后,调用主线程来更新UI.下面就是 ...
最新文章
- 安防行业巨头都是如何布局无人机的?
- ASP.NET.4.5.1+MVC5.0系统角色和权限讲解
- 计蒜客 时间复杂度 (模拟) 洛谷 P3952 时间复杂度
- Hadoop命令执行时提示JVM OOM问题的处理
- mysql主从备份失败--记录现象
- kernel 中标准的 ir 模块的 时间的定义_Linux开机流程详解:BIOSgt;MBRgt;GRUBgt;Kernel...
- response.setcontenttype的參数
- mysql 5.6批处理慢_java – JDBC批处理执行速度极慢
- 0成本快速提升群活跃等级点亮群LV5图标
- 河南最新建筑施工八大员之(安全员)考试真题及答案解析
- Git + Github初入门
- 打印机设备与计算机连接类型,电脑打印机的连接方式 打印机的种类有哪些
- r语言实现关联分析--关联规则挖掘(Apriori算法) (r语言预测学习笔记)
- 怎么把图片转换成BMP格式
- 如何用python赚钱_一篇文章教你使用Python自动赚取支付宝积分,网友:发家致富?...
- 可执行 jar 和普通 jar 区别
- 【转载】中庸与技术书
- Hive安装过程中出现 The reference to entity createDatabaseIfNotExist must end with the ';' delimiter.问题
- 盼望着,盼望着,东风来了,春天的脚步近了。
- 未来科幻点击解谜游戏《英科迪亚》现已登陆NS