在Android中,进行内存优化,最重要的优化处理是对图片进行内存的优化处理,毕竟图片占用的内存是非常大的,对于图片的内存处理,是android中内存优化的重中之重。目前开源的4大图片处理框架都对图片的内存方面处理都是非常优秀的,但是对于这么多的框架,如何选择适合自己项目需求的框架,就需要先了解每个框架的特性,下面就来分析一下每个框架的特点。

Universal-Image-Loader(UIL)

  • 多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等
  • 支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置
  • 支持图片的内存缓存,文件系统缓存或者SD卡缓存
  • 支持图片下载过程的监听
  • 根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存
  • 较好的控制图片的加载过程,例如暂停图片加载,重新开始加载图片,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片
  • 提供在较慢的网络下对图片进行加载
  • 默认实现多种内存缓存算法 这几个图片缓存都可以配置缓存算法,不过 ImageLoader 默认实现了较多缓存算法,如 Size最大先删除、使用最少先删除、最近最少使用、先进先删除、时间最长先删除等。

-不支持GIF图片加载, 缓存机制没有和http的缓存很好的结合

ImageLoader的设计流程:
Android 常用图片框架对比_第1张图片
ImageLoader收到展示和加载图片的任务,并交给ImageLoaderEngine(创建任务,并进行任务调度)分配到具体的线程池去完成,任务通过 Cache (本地缓存)及 ImageDownloader (从网络获取图片)获取图片,中间可能经过 BitmapProcessor(图片处理器) 和 ImageDecoder (图片解码)处理,最终转换为Bitmap 交BitmapDisplayer 在 ImageAware 中显示。
注:其中 Cache 分为 MemoryCache(内存缓存) 和 DiskCache(硬盘缓存) 两部分。
Processor 资源(图片)处理器,负责处理资源,比如旋转、压缩、截取等。

Glide

Glide是一个高效、开源、 Android设备上的媒体管理框架,Glide具有获取、解码和展示视频剧照、图片、动画等功能,它还有灵活的API,这些API使开发者能够将Glide应用在几乎任何网络协议栈里。创建Glide的主要目的有两个,一个是实现平滑的图片列表滚动效果(滚动流畅),另一个是支持远程图片的获取、大小调整和展示

  • GIF动画的解码:通过调用Glide.with(context).load(“图片路径“)方法,GIF动画图片可以自动显示为动画效果。如果想有更多的控制,还可以使用Glide.with(context).load(“图片路径“).asBitmap()方法加载静态图片,使用Glide.with(context).load(“图片路径“).asGif()方法加载动画图片

  • 本地视频剧照的解码:通过调用Glide.with(context).load(“图片路径“)方法,Glide能够支持Android设备中的所有视频剧照的加载和展示

  • 缩略图的支持:为了减少在同一个view组件里同时加载多张图片的时间,可以调用Glide.with(context).load(“图片路径“).thumbnail(“缩略比例“).into(“view组件“)方法加载一个缩略图,还可以控制thumbnail()中的参数的大小,以控制显示不同比例大小的缩略图

  • Activity生命周期的集成:当Activity暂停和重启时,Glide能够做到智能的暂停和重新开始请求,并且当Android设备的连接状态变化时,所有失败的请求能够自动重新请求

  • 转码的支持:Glide的toBytes() 和transcode() 两个方法可以用来获取、解码和变换背景图片,并且transcode()
    方法还能够改变图片的样式

  • 动画的支持:新增支持图片的淡入淡出动画效果(调用crossFade()方法)和查看动画的属性的功能

  • 支持优先级处理

  • OkHttp和Volley的支持:默认选择HttpUrlConnection作为网络协议栈,还可以选择OkHttp和Volley作为网络协议栈

  • 其他功能:如在图片加载过程中,使用Drawables对象作为占位符、图片请求的优化、图片的宽度和高度可重新设定、缩略图和原图的缓存等功能

Glide的流程设计:
Android 常用图片框架对比_第2张图片
Glide 收到加载及显示资源的任务,创建 Request 并将它交给RequestManager(任务管理器),Request 启动 Engine(数据获取引擎) 去数据源获取资源(通过 Fetcher(数据获取器) ),获取到后 Transformation(图片处理) 处理后交给 Target(目标)。

Picasso

  • 自带统计监控功能,支持图片缓存使用的监控,包括缓存命中率、已使用内存大小、节省的流量等。

  • 支持优先级处理

  • 支持延迟到图片尺寸计算完成加载

  • 支持飞行模式、并发线程数根据网络类型而变,手机切换到飞行模式或网络类型变换时会自动调整线程池最大并发数。

  • “无”本地缓存。Picasso 自己没有实现本地缓存,而由okhttp 去实现,这样的好处是可以通过请求 Response Header 中的 Cache-Control 及 Expired 控制图片的过期时间。

  • 在adapter中需要取消已经不在视野范围的ImageView图片资源的加载,否则会导致图片错位,Picasso已经解决了这个问题。

  • 使用复杂的图片压缩转换来尽可能的减少内存消耗

  • 不支持GIF,默认使用ARGB_8888格式缓存图片,缓存体积大

Picasso的流程设计:
Android 常用图片框架对比_第3张图片
Picasso 收到加载及显示图片的任务,创建 Request 并将它交给 Dispatcher,Dispatcher 分发任务到具体 RequestHandler,任务通过 MemoryCache 及 Handler(数据获取接口) 获取图片,图片获取成功后通过 PicassoDrawable 显示到 Target 中。

注:Dispatcher 负责分发和处理 Action,包括提交、暂停、继续、取消、网络状态变化、重试等等。

Fresco

  • 支持webp格式的图片,是Google官方推行的,它的大小比其它格式图片的大小要小一半左右,使用该格式最大的优点就是轻量、省流量、图片加载迅速。而Fresco是通过jni来实现支持WebP格式图片。

  • 5.0以下系统:使用”ashmem”(匿名共享内存)区域存储Bitmap缓存,这样Bitmap对象的创建、释放将永远不会触发GC,关于”ashmem”存储区域,它是一个不在Java堆区的一片存储内存空间,它的管理由Linux内核驱动管理,不必深究,只要知道这块存储区域是别于堆内存之外的一块空间就行了,且这块空间是可以多进程共享的,GC的活动不会影响到它。5.0以上系统,由于内存管理的优化,所以对于5.0以上的系统Fresco将Bitmap缓存直接放到了堆内存中。除了使用Ashmem的黑科技外,还采用了类似GC的引用计数机制,通过对图片对象的引起计数,使得不再使用的图片对象可以更早的被回收以便降低内存开销。

  • 渐进式加载JPEG图片, 支持图片从模糊到清晰加载

  • 图片可以以任意的中心点显示在ImageView, 而不仅仅是图片的中心

  • JPEG图片改变大小也是在native进行的, 不是在虚拟机的堆内存, 同样减少OOM

  • 很好的支持GIF图片的显示

  • 框架较大, 影响Apk体积,使用较繁琐

下面是4个框架的对比:

ImageLoader Glide Picasso Fresco
框架是否一直支持更新
是否易用(主要是指代码调用是否简洁)
包的大小 162kb 474kb 120kb 16.8M(zip)
是否能够灵活配置可以灵活配置(例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置)
内存占用(相对于其他三个框架) 内存占用偏高(仅仅比Fresco占用内存小一点) 适中
是否支持下载进度监听
是否支持生命周期 生命周期支持不够智能,需要自己手动的在生命周期方法中进行处理
动图,webp是否支持 不支持gif,不支持缩略图,支持webP

总结
Universal Image Loader是早期比较有代表性的图片加载库,虽然目前已经停止维护,不再推荐使用,但是其架构设计和实现依然值得借鉴。Picasso的设计充分体现了Square公司在架构设计上一贯的简洁易用风格(链式调用)。Glide充分吸收了Picasso的优点,并在此基础上做了大量的优化和改进。Fresco 可以说是综合了之前图片加载库的优点并将性能优化到极致,但它的包很大,用法比较复杂,API不够简洁,所以, Fresco 在图片较多的应用中更能凸显其价值,如果应用没有太多图片需求,还是不推荐使用 Fresco,Glide基本就能满足需求。

参考:
主流图片加载框架ImageLoader、Glide、Picasso、Fresco性能分析—内存占用比较

Picasso, ImageLoader, Fresco, Glide 优劣

Android 三大图片加载框架的对比——ImageLoader,Picasso,Glide

andrid四大图片加载框架对比分析
https://www.jianshu.com/p/f00c4ee582f5

Android各大图片加载框架之间的比较
https://blog.csdn.net/tomcat0916/article/details/81902189

Android图片框架对比
https://www.jianshu.com/p/3a57d535c656

更多相关文章

  1. Android类加载机制的细枝末节
  2. Android超炫图片浏览器代码
  3. 彻底解析Android缓存机制——LruCache
  4. 转载--Android 开发 调用图库选择图片实现和参数详解
  5. 将android Market缓存转移到SD卡的小程序
  6. Android 缓存策略
  7. ReactNative Android 实现加载本地图片
  8. Android Tween动画之RotateAnimation实现图片不停旋转
  9. Android WebView加载https页面不能正常显示资源问题

随机推荐

  1. Android 高德地图自定义定位图标的显示
  2. 一个高效、稳定、强大的Android刷新库
  3. Android 4.0源码编译不生成odex
  4. android 集成Facebook 分享功能
  5. Android中的线程之线程基础(synchronized,w
  6. [Android]下载CM11.0 Android 源码过程与
  7. android 基础知识 四大组件之Activity(一)
  8. Android学习笔记之——opencv开发进一步
  9. 关于 AndroidManifest
  10. Android实现信号强度监听的方法