Android性能优化之Bitmap导致的内存溢出

  • 时间:
  • 浏览:1

代码嘴笨 某些我将Bitmap转化为byte数组,否则将你你你这个 byte数组传到七牛上,以前 图片处理突然是某些我做的,也这麼突然出现任何问题报告 。为哪几种这次却报了OOM呢,中场暂停一下,先来了解一下图片相关的知识:

推荐简书上这篇文章,说的很全部,这里就不重复了。对照这篇文章一步一步进行即可:

1.静态变量由于的内存溢出

2.单例模式由于的内存溢出

3.大量位图的加载由于的内存溢出

新版的Android Studio给我能 们 提供了内存分析的可视化界面,否则精确的检测并找到内存泄漏的由于,我能 们 还还要第三方的工具。

三.优化过程:

options.inJustDecodeBounds = true,表示解析图片的以前 ,只解析长度和深度1,不载入图片,某些我能 节省内存开支。

options.inPreferredConfig = Bitmap.Config.RGB_565,前文提到的表格一目了然,某些我会节省一半的内存。

options.inSampleSize = calculateInSampleSize(options, 10000, 10000),计算缩放的比例,inSampleSize只能是2的整数次幂,否则就有一句话,向下取得最大的2的整数次幂,比如比例为7,向下寻找2的整数次幂,某些我4。否则缩放比例是4一句话,7.9M的那张图片最后占用的内存会是7.9/16=0.49M,全部不必担心OOM的处在。

options.inJustDecodeBounds = false,计算好压缩比例后,去加载解析原图。

bitmap = BitmapFactory.decodeFile(filePath, options),解析文件得到Bitmap。

与以前 的代码相比,优化以前 我改变了options.inPreferredConfig的值,否则在转换得到Bitmap的以前 换成了try/catch,突然出现异常一句话进一步扩大缩放比例,减小内存,处理OOM。

使用新版Android Studio检测内存泄露和性能

实例化有八个 BitmapFactory.Options,并配置它的相关属性:

默认值为ARGB_8888。一张质量不必高的图片以Bitmap的形式加载到内存中占用的内存就快8M,当一次性加载大量位图的以前 ,肯定会远远超过应用线程所分配的内存空间,从要由于OOM。对于配置不高,系统版本缺乏,应用线程内存紧张的手机来说,突然出现你你你这个 清况 的概率会大大增加。某些我能 们 有必要对图片进行必要的压缩,减小内存,处理OOM。

这里我能 们 根据反馈上来崩溃日志,可不还要很清楚的看后我能 们 这次的内存溢出是由第你你你这个 由于由于的。这麼就从你你你这个 问题报告 入手,找到处理Android中因Bitmap由于内存溢出的法律法律依据。

以我红米2的测试机为例,一张图库里的图片分辨率是101000*1920px,它的文件大小为192KB,此时这张图片是以文件的形式处在于硬盘上。这麼我能 们 否则以Bitmap的形式将这张图片加载到应用线程中,占用的内存是多少呢:

101000*1920*4=82941000B=7.9M

Bitmap的实例化是通过BitmapFactory提供的接口生成的,利用BitmapFactory可不还要从有八个 指定文件中,利用decodeFile()解出Bitmap,也可不还要定义的图片资源中,利用decodeResource()解出Bitmap。它的主要法律法律依据及配置选项如下:

当图片从Bitmap的形式转化为二进制的形式(文件形式)时, 我能 们 可不还要适当使用质量压缩,加快传递速度单位。还是以前 那张图片,192KB的图片经过以上法律法律依据的质量压缩以前 ,大小为144KB左右(嘴笨 图片大小变小,否则转换为Bitmap的以前 ,这张经过质量压缩后的图片所占内存还是不必变的,仍然为7.9M)。随着手机硬件配置的提升,手机图片的质量也这麼高,某些质量压缩还是很必要的。

图片(BitMap)占用的内存=图片长度 * 图片深度1*单位像素占用的字节数

前有八个 分别代表长度与深度1(像素单位),单位像素占用字节数其大小由BitmapFactory.Options的inPreferredConfig变量决定。

inPreferredConfig为Bitmap.Config类型,是个枚举类型,对应如下:

java.lang.OutOfMemoryError:应用线程内存溢出,俗称OOM,是指应用线程在申请内存时,这麼足够的内存空间供其使用而突然出现的问题报告 。Android中常见的由于内存溢出的场景有以下几种:

当我把以文件形式处在在硬盘上的图片,以Bitmap的形式加载到内存中的以前 ,我能 还要进行尺寸压缩,否则质量压缩不必会改变Bitmap所占内存的大小,而尺寸压缩否则是减小了图片的像素,某些它直接对bitmap产生了影响,从而使所占内存减小。代码具体实现过程:

某些我计划是按照章节顺序学习《Android开发艺术探索》这本书的,Android性能优化这偏离 也是本书的最后一章。否则周末的以前 ,友盟线下反馈的公司项目的有八个 错误我能 不得不提前学习你你你这个 块的知识。先看看线下反馈的错误吧:

以上是尺寸压缩的相关法律法律依据,这麼质量压缩又用在哪里呢:

代码分析:

二.分析具体由于

项目中应用嘴笨 很常见,在客户端选着图片以前 ,上传到七牛,否则再把七牛返回的url存储到服务器上。可问题报告 就突然出现在图片上传到七牛的你你你这个 步,我能 们 先看一下以前 以前 结束的代码为什么会么会会 写的:

一.检测内存溢出

图片的压缩分为你你你这个 :质量压缩与尺寸压缩,区别是质量压缩不必会改变图片的尺寸,而尺寸压缩则会改变图片的尺寸。这麼它们分别应用在哪几种地方呢,还是以刚才那张图片为例子。

以上某些我从这次Bitmap由于的内存溢出学习总结到的某些知识,希望能对你有所帮助。下一篇再见~~~