Android内存优化之图片优化

关于图片优化,大概如下

为什么要进行图片优化
在这里插入图片描述
相信大概刚开始学习Android的时候有过图片过大而直接报错的情况,下面简单介绍一下OOM问题,Android支持的图片格式及图片优化的几种方式
在这里插入图片描述
什么是OOM?:Android系统的进程(APP级别)有最大的内存限制,超过这个限制系统就会抛出)OOM错误
图片OOM问题产生的几种情况
1.一个页面一次加载过多的图片
2.加载大图片没有进行压缩
3.Android列表加载大量bitmap没有使用缓存(第三方框架)

Android支持的图片格式
png:无损压缩的图片格式,支持透明通道,占用的空间一般比较大
Jpeg:有损压缩的图片格式,不支持透明通道
webp:由谷歌2010年发布,支持无损与有损,比较理想
gif:支持多帧动画,但安卓本身图片库不支持,需要用到第三方框架

为了方便理解,还得介绍一下图片占用内存的知识
如何计算:图片宽图片高一个像素占的内存大小

所以由上可见,图片储存优化的方式如下
1.尺寸优化:通过减小宽高来实现
2.质量压缩:改变一个像素占用的内存(优化解码率)
3.内存重用:需要用到inBitmap属性

先从尺寸压缩开始说起
主要起作用的为两个方法
intJustDecodeBounds=true(可以在不加载图片的情况下获得图片的宽高)
inSampleSize(用合适的压缩比)
!!!如果只是单纯的改变ImageView的大小,不会对图片产生任何作用(需要对bitmap进行优化
可能还不是很清楚,所以贴张图
在这里插入图片描述
质量压缩
常见的图片格式在设置在UI上之前需要经过解码过程
使用RGB-565代替ARGB-8888可以降低图片占用内存,上面那张图已经有了,如下红色矩形类内在这里插入图片描述
内存重用
InBItmap,后面的图需<=第一张图的大小,下图为第二张图片重用第一张图
mCurrentBitmap为第一张图的Bitmap
在这里插入图片描述
然后小提一下Bitmap的内存管理
在3.0前,对于像素数据的支持保存在本地内存中,
在3.0后,像素数据和位图都储存在Dalvik堆中

以上为图片的储存优化,接下来介绍图片加载优化
首先要了解两个资源文件夹
mipmap和drawable,一般情况下,启动图标放在mipmap文件夹,
然后这两个文件夹的区别为setHasMipmap的值
mipmap为true,drawable为false

如何让Android图片资源适配各种分辨率的手机
先了解分辨率和DPI ,分辨率单位为px
1.240-320 xhdpi
2.320-480 xxhdpi !!!主流
3.480-640 xxxhdpi

下面提供两种方案
方案一:为每种dpi都出一套图片资源 (为设计师增加了工作量,且增大了APK大小)
方案二:提供一套需要支持的最大dpi的图片,(自动渲染的概念);

下面介绍一下图片匹配的规则(假设我的手机为480dpi分辨率的手机,我将需要的图片放在xhdpi文件夹下,系统处理如下)
1.先查找xxhdpi文件夹,没有找到,往下走
2.再查找xxxhdpi文件夹,没有找到,往下走
3.再查找nohdpi文件夹,如果还没有找到,才会去xhdpi文件夹

其中有一个问题,一个手机从不同的文件夹下拿图片,显示效果是不同的,如果不是匹配的文件夹,系统会对其图片放大或缩小

常见的图片加载优化方法
1.异步优化:图片放在后台请求(不占用主UI的资源)
2.图片缓存:对于列表中的图片进行缓存(本地文件中的缓存)
3.网络请求:使用OkHttp进行图片请求(优点很多)
4.懒加载:当图片呈现到可视区域再进行加载

其中图片的加载一般用多级缓存加载流程
在这里插入图片描述
主要原因如下
如果每次都用网络请求(服务器受不了,且浪费用户流量),需通常使用内存加本地文件两级缓存(如何单纯使用本地文件,不安全,容易被清除掉)。

小提一下超大图片加载方案
使用图片压缩来加载超大图片,会看不清图片细节
使用BitmapRegionDecoder来解决

下面为大家介绍一下几大图片加载的框架
1.Universal ImageLoader,优点如下
多线程,支持下载监听
bitmap裁剪
ListView暂停加载
自由配置
较好的控制图片的加载过程
提供在较慢的网络下对图片进行加载

2.Picasso,特点如下
缓存图片原图到本地
使用ARGB-8888(占用内存比较大)

3.Glide(来自谷歌),特点如下
与Activity/Fragment生命周期一致
改变图片的大小再加载到内存

4.Fresco(来自脸谱),特点如下(重点介绍)
性能好:首次加载图片速度非常快,用户体验好
内存表现出色:有效的对内存块的图片进行了管理(共享内存机制来解决图片加载的oom问题)
渐进式预览:大致展示图片轮廓,然后逐渐展示清晰图片
多图请求 封装了先加载底分辨率图片,然后再显示高分辨率图片
图片呈现效果:自定义占位符,圆角图
Gif,Webp格式
在5.0以下系统,Fresco将图片放到一个特别的内存区域。当然,在图片不显示的时候,占用的内存会自动被释放。这会使得APP更加流畅,减少因图片内存占用而引发的OOM。
加载Gif图和WebP动图在任何一个Android开发者眼里看来都是一件非常头疼的事情。每一帧都是一张很大的Bitmap,每一个动画都有很多帧。Fresco让你没有这些烦恼,它处理好每一帧并管理好你的内存。

以上就是大概的内容了,由于博主时间问题,会于以后写关于框架的使用及关于图片优化的小案例

评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值