Android 五大开源组件加载网络图片的优缺点比较

Android 五大开源组件 Universal-Image-Loader,Android-Volley,Picasso,Fresco,Glide 加载网络图片的优缺点比较。

在 Android 中的加载网络图片是一件十分令人头疼的事情,在网上有着许多关于加载网络图片的开源库,可以让我们十分方便的加载网络图片。在这里主要介绍一下在使用 Universal-Image-Loader,Android-Volley,Picasso,Fresco,Glide 的一些使用的感悟,以及最基本的用法介绍。

一、Android-Volley 组件


给 ImageView 设置图片源

  1. // imageView 是一个 ImageView 实例
  2. // ImageLoader.getImageListener 的第二个参数是默认的图片 resource id
  3. // 第三个参数是请求失败时候的资源 id,可以指定为 0
  4. ImageListener listener = ImageLoader.getImageListener(imageView, android.R.drawable.ic_menu_rotate, android.R.drawable.ic_delete);
  5. mImageLoader.get(url, listener);

使用 NetworkImageView

Volley 提供了一个新的控件 NetworkImageView 来代替传统的 ImageView,这个控件的图片属性可以通过mImageView.setImageUrl(url, imageLoader);来设定。而且,这个控件在被从父控件 detach 的时候,会自动取消网络请求的,即完全不用我们担心相关网络请求的生命周期问题。

  1. mImageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache());
  2. .... ...
  3. if(holder.imageRequest != null) {
  4. holder.imageRequest.cancel();
  5. }
  6. holder.imageRequest = mImageLoader.get(BASE_UR + item.image_url, holder.imageView, R.drawable.loading, R.drawable.error);

总结:如果你的工程项目是一个比较小的项目,或者要求不是很高的项目,处理比较简单的可以使用这个库,这个库是 Google 2013 I/O 发布的一个开源库。使用这个库在图片的处理上,没有提供任何的图片处理的操作,个人感觉这个库主要在网络数据连接上比较好,在图片处理上还是不够完善强大。

二、Picasso 组件


Picasso 加载网络图片的使用很简单,只需要一行代码就可以搞定。

  1. Picasso.with(context) .load(url).resize(50, 50).centerCrop().into(imageView);

Picasso 有如下特性:

  • 处理 Adapter 中的 ImageView 回收和取消已经回收 ImageView 的下载进程。

  • 使用最少的内存完成复杂的图片转换,比如把下载的图片转换为圆角等。

  • 自动添加磁盘和内存缓存。

总结:如果你的项目里面,对于图片有一些 具体的要求的话,建议使用这个库,但是这个库当你需要对图片作一些具体的操作比如加载圆角矩形图片、裁剪图片为圆形时,需要你自己写一些操作,如果基础不 够好的会感觉很困难。还有就是这个库我们只能看到结果,无法关心图片的下载过程。

三、Universal-Image-Loader 组件


  • 先要配置 ImageLoaderConfiguration 这个类实现全局 ImageLoader 的实现情况。可以选择在 Application 中初始化设置该类。

  • 使用 ImageLoader 进行图片加载的时候,先要实例化 ImageLoader。

总结:这个库有着对加载网络图片的吵详细配置。可以根据个人的喜欢,进行一些配置等等。并且可以实现图片下载过程的监听。且可以支持图片下载完成后,显示圆形或者圆角矩形的图片。

四、Fresco 组件


Fresco 组件是 Facebook 推出的一款用于 Android 应用中展示图片的强大图片库,它能够从网络、本地存储和本地资源中加载图片。而且,为了节省数据和 CPU,它拥有三级缓存。

Fresco 是一个强大的图片加载组件。

Fresco 中设计有一个叫做 image pipeline 的模块。它负责从网络,从本地文件系统,本地资源加载图片。为了最大限度节省空间和 CPU 时间,它含有3级缓存设计(2级内存,1级文件)。

Fresco 中设计有一个叫做 Drawees 模块,方便地显示 loading 图,当图片不再显示在屏幕上时,及时地释放内存和空间占用。

Fresco 支持 Android2.3(API level 9) 及其以上系统。

Fresco 特性

  • 内存管理

    解压后的图片,即 Android 中的 Bitmap,占用大量的内存。大的内存占用势必引发更加频繁的 GC。在5.0以下,GC 将会显著地引发界面卡顿。

    在5.0以下系统,Fresco 将图片放到一个特别的内存区域。当然,在图片不显示的时候,占用的内存会自动被释放。这会使得 APP 更加流畅,减少因图片内存占用而引发的 OOM。

    Fresco 在低端机器上表现一样出色,你再也不用因图片内存占用而思前想后。

  • 图片的渐进式呈现

    渐进式的 JPEG 图片格式已经流行数年了,渐进式图片格式先呈现大致的图片轮廓,然后随着图片下载的继续,呈现逐渐清晰的图片,这对于移动设备,尤其是慢网络有极大的利好,可带来更好的用户体验。

    Android 本身的图片库不支持此格式,但是 Fresco 支持。使用时和往常一样,仅仅需要提供一个图片的 URI 即可,剩下的事情,Fresco 会处理。

  • Gif 图和 WebP 格式

    是的,支持加载Gif图,支持WebP格式。

  • 图像的呈现

    Fresco 的 Drawees 设计,带来一些有用的特性:

    • 自定义居中焦点(对人脸等图片显示非常有帮助)。

    • 圆角图,当然圆圈也行。

    • 下载失败之后,点击重新下载。

    • 自定义占位图,自定义 overlay,或者进度条。

    • 指定用户按压时的 overlay。

  • 图像的加载

    Fresco 的 image pipeline 设计,允许用户在多方面控制图片的加载:

    • 为同一个图片指定不同的远程路径,或者使用已经存在本地缓存中的图片。

    • 先显示一个低解析度的图片,等高清图下载完之后再显示高清图。

    • 加载完成回调通知。

    • 对于本地图,如有 EXIF 缩略图,在大图加载完成之前,可先显示缩略图。

    • 缩放或者旋转图片。

    • 处理已下载的图片。

    • WebP 支持。

五、Glide 组件


Glide 是一个高效、开源、Android 设备上的媒体管理框架,它遵循 BSD、MIT 以及 Apache 2.0 协议发布。Glide 具有获取、解码和展示视频剧照、图片、动画等功能,它还有灵活的 API,这些 API 使开发者能够将 Glide 应用在几乎任何网络协议栈里。创建 Glide 的主要目的有两个,一个是实现平滑的图片列表滚动效果,另一个是支持远程图片的获取、大小调整和展示。近日,Glide 3.0 发布,现已提供 jar 包下载 ,同时还支持使用 Gradle 以及 Maven 进行构建。该版本包括很多值得关注的新功能,如支持 Gif 动画和视频剧照解码、智能的暂停和重新开始请求、支持缩略图等,具体新增功能如下如下:

  • 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 2.x 系列版本的所有功能,如背景图片的加载、内存和磁盘间的高效缓存、使用位图和资源池提高加载性能, 更多 Glide3.0 相关信息请登陆 GitHub 上的 Wiki 页面查看。

六、简单理解五个组件


Universal Image Loader:一个强大的图片加载库,包含各种各样的配置,最老牌,使用也最广泛。

Picasso:Square 出品,必属精品。和 OkHttp 搭配起来更配呦!

Volley Image Loader:Google 官方出品,可惜不能加载本地图片~

Fresco:Facebook 出的,天生骄傲!不是一般的强大。

Glide:Google 推荐的图片加载库,专注于流畅的滚动。

七、总结


Glide 和 Picasso 都是非常完美的库。Glide 加载图像以及磁盘缓存的方式都要优于 Picasso,速度更快,并且 Glide 更有利于减少 OutOfMemoryError 的发生,GIF 动画是 Glide 的杀手锏。不过 Picasso 的图片质量更高。你更喜欢哪个呢?

虽然我使用了很长时间的 Picasso,但是我得承认现在我更喜欢 Glide。我的建议是使用 Glide,但是将 Bitmap 格式换成 ARGB_8888、让 Glide 缓存同时缓存全尺寸和改变尺寸两种。

(完)