Android开发图片加载框架Glide、Fresco、Picasso、ImageLoader特点和优缺点

1,185 阅读8分钟

一、Glide 图片加载框架

1、简介:

Glide 是一款谷歌官方推荐使用的强大图片加载框架, 作者是bumptech,这个库被广泛运用在谷歌的开源项目中。

2、功能特点:

  • 图片异步加载,设置加载尺寸,设置加载动画,设置加载中和加载失败的图片,加载的图片格式丰富:JPG,PNG,GIF,WEBP支持设置缩略图
  • 加载的图片路径多种:网络本地资源assets等
  • 缓存特点:跳过内存缓存,缓存动态清理,设置缓存策略
  • 其他特点:生命周期集成,设置动态转换,设置下载优先级

3、磁盘缓存策略

Glide磁盘缓存策略分为四种,默认的是结果:

  • 所有:缓存原图(SOURCE)和处理图(RESULT)
  • NONE:什么都不缓存
  • SOURCE:只缓存原图(SOURCE)
  • RESULT:只缓存处理图(RESULT) - 默认值

组合策略 : 和其他三级缓存一样,滑翔的缓存读取顺序是

内存(使用LRU算法) - >磁盘(使用弱引用缓存正在使用的资源) - >网络

4、优点与缺点:

优点:

  1. 使用简单,可配置度高,自适应程度高
  2. 多样化媒体加载:Glide不仅是一个图片缓存,支持常见的图片格式jpg png gif webp
  3. 生命周期集成:根据Activity/fragment生命周期自动管理请求,将Activity/Fragment作为with()参数的好处是:图片加载会和Activity/Fragment的生命周期保持一致,比如Paused状态在暂停加载,在Resumed的时候又自动重新加载
  4. 高效的缓存策略
    • 支持Memory和Disk图片缓存
    • Picasso缓存的是全尺寸的,而Glide缓存的是跟ImageView尺寸相同的
    • 内存开销小,Glide加载的图片质量要差于Picasso,因为Glide默认的Bitmap格式是RGB_565 ,比ARGB_8888格式的内存开销要小一半。
    • 高效处理bitmap,使用bitmap pool使bitmap复用,主动调用recycle回收需要回收的bitmap,减少系统回收压力
    • 图片缓存->媒体缓存
    • 支持优先级处理
    • 支持 okhttp、Volley

缺点

  1. 使用方法复杂
  2. 由于Glide其功能强大,所以使用的方法非常多,其源码也相对的复杂
  3. 包较大

二、Fresco 图片加载框架

1、简介:

Fresco是Facebook的最新推出的一款用于Android的应用中展示图片的强大图片库。

2、主要特点:

  • 两个内存缓存加上本地缓存构成了三级缓存
  • 渐进式呈现图片
  • 支持加载的Gif图和WebP的格式

3、主要功能:

带进度条的图片,图片的不同裁剪,圆形和圆角图片,渐进式展示图片,GIF动画图片,多图请求及图片复用,图片加载监听,图片缩放和旋转,修改图片和动态展示图片等功

4、优点与缺点:

优点:

  • 内存自动回收。图片不可见时,会及时自动释放所占用的内存,尽可能地避免OOM
  • 三级缓存机制。两级内存缓存(解码的与未解码的)+一级磁盘缓存,提升加载速度,节省内存占用空间
  • 支持各种加载场景。如动图加载,高斯模糊等常见的图片加载场景。另外还提供了独特的渐进式加载,先加载小图再加载大图,加载进度等功能(很强大) 。

缺点:

  • 框架较大,影响Apk体积
  • 侵入性较强。须使用它提供的SimpleDraweeView来代替ImageView的加载显示图片

三、Picasso 图片加载框架

1、简介:

Picasso是Square公司出品的一个强大的图片下载和缓存图片库

2、Picasso特点和功能

  • Picasso是全尺寸下载图片
  • Picasso默认的缓存格式为ARGB_888
  • 链式调用,使用简单;
  • 具有一般图片框架的基础功能;
  • 方便的图片转换; (图片高斯模糊,添加圆角,做度灰处理,圆形图片)
  • 加载过程监听和错误处理;
  • 自动添加磁盘和内存二级缓存;
  • 支持多种数据源加载。
  • Picasso默认不支持Gif图片加载。Picasso库很小,类也很少,库仅118KB大小。
  • Picasso支持调试和日志

3、Picasso缓存策略

1. 缓存(Disk and Memory):Picasso有内存缓存(Memory)和磁盘缓存(Disk)

  • LRU内存缓存为可用应用程序RAM的15%
  • 2%存储空间的磁盘缓存高达50MB但不低于5MB。
  • 三个用于磁盘和网络访问的下载线程。

2. Picasso内存缓存是使用的LRU策略的缓存实现:

memory(内存)-> disk(磁盘)-> network(网上)。

默认情况下,Picasso内存缓存和磁盘缓存都开启了的,

3. Picasso提供了设置缓存策略的方法。

  • memoryPolicy设置内存缓存策略:

    • NO_CACHE:表示处理请求的时候跳过检查内存缓存
    • NO_STORE:表示请求成功之后,不会最终的结果存到内存。
  • networkPolicy设置磁盘缓存策略:

    • NO_CACHE:表示处理请求的时候跳过处理磁盘缓存
    • NO_STORE:表示请求成功后,不会结果缓存到Disk,但是这个只对OkHttp有效。
    • OFFLINE:Picasso会强制这次请求从缓存中获取结果,不会发起网络请求,不管缓存中能否获取到结果。

4、Picasso解决了android中加载图片时需要解决的一些常见问题:

  • 在adapter中需要取消已经不在视野范围的ImageView图片资源的加载,否则会导致图片错位,Picasso已经解决了这个问题。
  • 使用复杂的图片压缩转换来尽可能的减少内存消耗
  • 自带内存和硬盘二级缓存功能

五:缺点:

不支持 GIF, 缓存的图片未缩放, 并且默认使用 ,使用ARGB_8888缓存图片, 缓存体积大.

四、ImageLoader 图片加载框架

1、简介:

ImageLoader 是最早开源的 Android 图片缓存库, 强大的缓存机制, 早期使用这个图片加载框架的Android应用非常多。

2、特点和功能:

  1. 使用多线程加载图片( 数据源可以是网络,本地,资源,assets )
  2. 灵活配置ImageLoader的基本参数,包括线程数、 图片下载器,内存缓存策略,硬盘缓存策略 、缓存方式、图片显示选项等;
  3. 图片异步加载缓存机制,包括内存缓存及SDCard缓存;
  4. 采用监听器监听图片加载过程及相应事件的处理;
  5. 配置加载的图片显示选项,比如图片的圆角处理及渐变动画。
    • 根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存
    • 提供在较慢的网络下对图片进行加载

3、缓存策略

(1)Imageloader内存缓存策略

  • 只使用的是强引用缓存
    • LruMemoryCache(默认的内存缓存类,缓存的是bitmap的强引用)

(2)使用强引用和弱引用相结合的缓存有

  • UsingFreqLimitedMemoryCache(缓存的图片总量超过限定值,删除使用频率最小的bitmap)
  • LRULimitedMemoryCache(使用的lru算法,和LruMemoryCache不同的是他缓存的是bitmap的弱引用)
  • FIFOLimitedMemoryCache(先进先出的缓存策略,当超过设定值,先删除最先加入缓存的bitmap)
  • LargestLimitedMemoryCache(当超过缓存限定值,先删除最大的bitmap对象)
  • LimitedAgeMemoryCache(当 bitmap加入缓存中的时间超过我们设定的值,将其删除)

(3)只使用弱引用缓存

WeakMemoryCache(缓存bitmap的总大小没有限制,不足就是不稳定,缓存的图片容易被回收)

(4)Imageloader** **硬盘缓存

  • FileCountLimitedDiscCache(设定缓存图片的个数,超过设定值,删除掉最先加入到硬盘的文件)
  • LimitedAgeDiscCache(设定文件存活的最长时间,当超过这个值,就删除该文件)
  • TotalSizeLimitedDiscCache(设定缓存bitmap的最大值,当超过这个值,删除最先加入到硬盘的文件)
  • UnlimitedDiscCache(这个缓存类没有任何的限制)

4、优点与缺点:

优点:

  • 支持下载进度监听
  • 可以在 View 滚动中暂停图片加载
  • 通过 PauseOnScrollListener 接口可以在 View 滚动中暂停图片加载。
  • 默认实现多种内存缓存算法 这几个图片缓存都可以配置缓存算法,不过 ImageLoader 默认实现了较多缓存算法,如 Size 最大先删除、使用最少先删除、最近最少使用、先进先删除、时间最长先删除等。
  • 支持本地缓存文件名规则定义

缺点:

不支持GIF图片加载, 使用稍微繁琐, 并且缓存机制没有和http的缓 存很好的结合, 完全是自己的一套缓存机制(完整大小).

五、总结

Picasso和Glide 对比的优缺点

  1. Picasso和Glide的withi后面的参数不同
  • Picasso.with(这里只能传入上下文) .
  • Glide.with(可以传context,activity,fragment) 2.加载后图片质量不同(Picasso:ARGB-8888,Glide:RGB-565)

3.加载Gif图片(Picasso不能加载Gif图片,Glide可以加载Gif图片)

4.缓存策略和加载速度

  • Picasso缓存的是全尺寸,而 Glide的缓存的更ImageView的尺寸相同
  • 调整ImageView大小,Picasso只缓存一个全尺寸,Glide则会为每种大小都缓存一次

最后放一张网络上找的图片