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到底占据多少内存相关推荐

  1. Android Bitmap 全面解析(二)加载多张图片的缓存处理

    一般少量图片是很少出现OOM异常的,除非单张图片过~大~ 那么就可以用教程一里面的方法了 通常应用场景是listview列表加载多张图片,为了提高效率一般要缓存一部分图片,这样方便再次查看时能快速显示 ...

  2. Android测量图像中物体大小,android – 加载图像后测量ImageView

    我试图找到一种方法来测量ImageView后使用Glide或Picasso(或其他任何东西)加载图像.基本上,我试图在某些位置在图像顶部布局其他视图,但需要最终的ImageViews尺寸才能准确地完成 ...

  3. 编辑器如何加载多张图片

    只有M1(完整版).M3(拼图)支持加载多张图片 加载多张图片使用xiuxiu.loadPhoto(images,base64,id); 若M1加载多张图片,多加一个固定参数,则使用xiuxiu.lo ...

  4. android 实现异步加载图片,Android中ImageView异步加载图片类

    本源码是从网络找到经修改以方便直接调用感觉用着还可以 首先在项目中添加一个专门加载图片的类AsyncImageLoaderpackage com.demo.core; import java.io.I ...

  5. 使用SDL加载多张图片(二)

    2019独角兽企业重金招聘Python工程师标准>>> http://lazyfoo.net/SDL_tutorials/index.php 这是官网的教程,英语还行的同学可以去看这 ...

  6. android7.0如何加载本地图片,Android 6.0和7.0 加载同一张图片,结果不同

    问题描述 Android6.0和7.0 加载一张jpg图片,转换为bitmap, 然后将其保存到本地,用UE比较两张本地图片的2进制,得到的结果不一致. 问题出现的环境背景及自己尝试过哪些方法 (1) ...

  7. jvm面试2 jvm如何加载java代码? JVM知识重点:内存模型和GC

    jvm如何加载java代码? native方法forName0 JVM知识重点:内存模型和GC' 注意:jvm是一个内存中的虚拟机 下面是Class类中,我们常用的forName方法 @CallerS ...

  8. android 加载图片进度条,ImageView上的Android进度条

    我正在开发一个应用程序,用户将从相机拍摄图片并将其显示在具有图像视图的预览屏幕上. **CameraCapture.java** class ButtonClickHandler implements ...

  9. IOS多线程 - 使用线程加载一张图片 - NSThread(1)(转)

    更新UI的操作在IOS中其实和在Android中是一致的,都是不能在主线程中执行比较耗时的操作,所以需要开启新线程去做这些操作,以免阻塞主线程,当新线程中的操作完成之后,调用主线程来更新UI.下面就是 ...

最新文章

  1. 安防行业巨头都是如何布局无人机的?
  2. ASP.NET.4.5.1+MVC5.0系统角色和权限讲解
  3. 计蒜客 时间复杂度 (模拟) 洛谷 P3952 时间复杂度
  4. Hadoop命令执行时提示JVM OOM问题的处理
  5. mysql主从备份失败--记录现象
  6. kernel 中标准的 ir 模块的 时间的定义_Linux开机流程详解:BIOSgt;MBRgt;GRUBgt;Kernel...
  7. response.setcontenttype的參数
  8. mysql 5.6批处理慢_java – JDBC批处理执行速度极慢
  9. 0成本快速提升群活跃等级点亮群LV5图标
  10. 河南最新建筑施工八大员之(安全员)考试真题及答案解析
  11. Git + Github初入门
  12. 打印机设备与计算机连接类型,电脑打印机的连接方式 打印机的种类有哪些
  13. r语言实现关联分析--关联规则挖掘(Apriori算法) (r语言预测学习笔记)
  14. 怎么把图片转换成BMP格式
  15. 如何用python赚钱_一篇文章教你使用Python自动赚取支付宝积分,网友:发家致富?...
  16. 可执行 jar 和普通 jar 区别
  17. 【转载】中庸与技术书
  18. Hive安装过程中出现 The reference to entity createDatabaseIfNotExist must end with the ';' delimiter.问题
  19. 盼望着,盼望着,东风来了,春天的脚步近了。
  20. 未来科幻点击解谜游戏《英科迪亚》现已登陆NS

热门文章

  1. 在Windows下安装JDK的通常步骤
  2. Linux加密框架 crypto 算法模板
  3. Ubuntu配置IPFS的环境
  4. 女性开车5大安全驾车好习惯 为您支招
  5. 先思再行 闭着眼睛编程
  6. 企业使用开源软件的风险
  7. 项目经理沟通的四个好习惯
  8. 常见音视频格式(转载)
  9. 哈哈哈,只有程序员才懂的黑色幽默 ... ...
  10. Linux whoami命令、Linux su命令、Linux w命令