1. 介绍

Glide是一个快速高效的Android图片加载库,注重于平滑的滚动Glide提供了易用的API,高性能、可扩展的图片解码管道(decode pipeline),以及自动的资源池技术。Glide 支持拉取,解码和展示视频快照,图片,和GIF动画。Glide几乎可以胜任任何你需要使用到图片从网络拉取,压缩,显示的场景。Glide的使用非常方便,相信下面的使用流程大家都不陌生:

Glide.with(context).load(图片路径).into(imageView);

它的github地址为:https://github.com/bumptech/glide
同样的提供了中文说明文档,地址为:https://muyangmin.github.io/glide-docs-cn/

在上面文档中对Glide这个框架的性能上的描述如下:
性能
Glide 充分考虑了Android图片加载性能的两个关键方面:

  • 图片解码速度
  • 解码图片带来的资源压力

为了让用户拥有良好的App使用体验,图片不仅要快速加载,而且还不能因为过多的主线程I/O或频繁的垃圾回收导致页面的闪烁和抖动现象

Glide使用了多个步骤来确保在Android上加载图片尽可能的快速和平滑:

  • 自动、智能地下采样(downsampling)和缓存(caching),以最小化存储开销和解码次数
  • 积极的资源重用,例如字节数组和Bitmap,以最小化昂贵的垃圾回收和堆碎片影响;
  • 深度的生命周期集成,以确保仅优先处理活跃的FragmentActivity的请求,并有利于应用在必要时释放资源以避免在后台时被杀掉。

2. 简单使用

添加依赖:

implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'

在Android中的性能优化方法一篇中,2.6 Bitmap优化部分我们测试了,在图片的大小为9.8MB的时候,加载图片到Bitmap中,bitmap实例对象为20MB,而Bitmap中超过16MB就会报错,故而这里我们还是使用这张图片来进行测试。

布局不变,仍然是一个ImageView来进行测试,然后我们不再使用Bitmap的图片尺寸压缩来压缩图片,直接使用下面的代码:

public class MergeTestActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_merge_test);ImageView image = findViewById(R.id.image);String fileName = Environment.getExternalStorageDirectory() + "/DCIM/未标题-1.jpg";Glide.with(this).load(new File(fileName)).into(image);}
}

就可以发现图片可以正常加载。也就是说Glide在底部确实给我们处理了图片压缩的问题。

为了适应不同的图片资源来源,在Glide中提供了如下几种方式进行图片的加载:

// 使用Uri
Glide.with(this).load(Uri.parse("https://img-blog.csdnimg.cn/eecca57f58db48e79b0db494455bb146.png")).into(image);// 使用File文件
String fileName = Environment.getExternalStorageDirectory() + "/DCIM/未标题-1.jpg";
Glide.with(this).load(new File(fileName)).into(image);// 使用字节数组byte[]
String fileName = Environment.getExternalStorageDirectory() + "/DCIM/未标题-1.jpg";
FileInputStream fileInputStream = null;
byte[] datas = null;
try {fileInputStream = new FileInputStream(new File(fileName));byte[] buf = new byte[1024];ByteArrayOutputStream output = new ByteArrayOutputStream();int length = 0;while ((length = fileInputStream.read(buf)) != -1) {output.write(buf, 0, length);  // 写入到输出流中}datas = output.toByteArray();output.close();fileInputStream.close();
} catch (IOException e) {e.printStackTrace();
}Glide.with(this).load(datas).into(image);// 使用Bitmap对象
Glide.with(this).load(getResources().getDrawable(R.drawable.aii)).into(image);// 使用String字符串
Glide.with(this).load("https://img-blog.csdnimg.cn/eecca57f58db48e79b0db494455bb146.png").into(image);String fileName = Environment.getExternalStorageDirectory() + "/DCIM/未标题-1.jpg";
Glide.with(this).load(fileName).into(image);// 使用资源文件ID
Glide.with(this).load(R.drawable.border_radius).into(image);

3. Glide高级使用场景

Glide图片加载框架的强大之处就在于可以处理很多场景,可以做一些边界处理。比如官网中列出有如下:

3.1 占位符

有三种类型的占位符:

  • Placeholder普通占位符,也就是在图片还未加载出来的时候,可以提前展示给用户的一张默认设置的图片来进行占位;
  • Error,错误占位符,即图片加载失败的占位符;
  • Fallback,后备回调符,默认情况下Glidenull 作为错误处理,所以可以接受 null 的应用应当显式地设置一个 fallback Drawable

比如:

Glide.with(fragment).load(url).fallback(R.drawable.fallback).into(view);

3.2 过渡选项

比如交叉淡入变换效果:

Glide.with(MergeTestActivity.this).load(Uri.parse("https://img-blog.csdnimg.cn/eecca57f58db48e79b0db494455bb146.png")).transition(DrawableTransitionOptions.withCrossFade()).into(image);

image设置一个点击函数,并且初始化给他加载一张图片,然后在点击函数中执行上面的代码,就可以出现交叉淡入变换效果。

3.3 缩略图

thumbnail() API 允许你简单快速地加载图像的低分辨率版本,并且同时加载图像的无损版本。如果缩略图加载在全尺寸加载之前完成,将显示缩略图。如果缩略图加载在全尺寸加载后完成,则不会显示缩略图。

Glide.with(MergeTestActivity.this).load(Uri.parse("https://img-blog.csdnimg.cn/eecca57f58db48e79b0db494455bb146.png")).thumbnail((float) 0.3)  // 控制显示不同比例的缩略图.transition(DrawableTransitionOptions.withCrossFade()).into(image);

可以使用thumbnail(float sizeMultiplier)来指定缩略图的比例大小。

3.4 加载GIF图片

可以按照上面的方式来调用,可以显示GIF动态图片,也可以指定当前加载的是一张动态图片。

Glide.with(MergeTestActivity.this).asGif().load(Uri.parse("https://img-blog.csdnimg.cn/eecca57f58db48e79b0db494455bb146.png")).thumbnail((float) 0.3).error(R.drawable.aii).transition(DrawableTransitionOptions.withCrossFade()).into(image);

注意到,如果不是GIF动态图片,图片将无法加载成功。

上面我们加载的是一张png图片,所以在使用asGif()的时候,图片不能成功加载。此时,我们可以使用error来指定一个错误后的图片,以增强健壮性。

3.5 加载静态图片

对于GIF图片,可以加载动态图片的第一帧为静态图片:

Glide.with(MergeTestActivity.this).asBitmap().load(Uri.parse("https://img-blog.csdnimg.cn/eecca57f58db48e79b0db494455bb146.png")).thumbnail((float) 0.3).transition(BitmapTransitionOptions.withCrossFade()).into(image);

需要注意到的是,如果我们指定为asBitmap(),那么我们在transition中需要使用BitmapTransitionOptions类的交叉淡入变换效果。

默认是Drawable的交叉淡入变换效果。

3.6 内存缓存

默认情况下,Glide使用 LruResourceCache ,这是 MemoryCache 接口的一个缺省实现,使用固定大小的内存和 LRU 算法。LruResourceCache 的大小由 GlideMemorySizeCalculator 类来决定,这个类主要关注设备的内存类型,设备 RAM 大小,以及屏幕分辨率。

应用程序可以自定义 MemoryCache 的大小,具体是在它们的 AppGlideModule 中使用 ,可以选择继承这个类来实现一些配置。

比如:

public class YourAppGlideModule extends AppGlideModule {@Overridepublic void applyOptions(Context context, GlideBuilder builder) {int memoryCacheSizeBytes = 1024 * 1024 * 20;  // 20mbbuilder.setMemoryCache(new LruResourceCache(memoryCacheSizeBytes));}
}

3.7 Bitmap 池

Glide 使用 LruBitmapPool 作为默认的 BitmapPool 。LruBitmapPool 是一个内存中的固定大小的 BitmapPool,使用 LRU 算法清理。默认大小基于设备的分辨率和密度,同时也考虑内存类和 isLowRamDevice 的返回值。

类似的:

public class YourAppGlideModule extends AppGlideModule {@Overridepublic void applyOptions(Context context, GlideBuilder builder) {int bitmapPoolSizeBytes = 1024 * 1024 * 30; // 30mbbuilder.setBitmapPool(new LruBitmapPool(bitmapPoolSizeBytes));}
}

3.8 磁盘缓存

Glide 使用 DiskLruCacheWrapper 作为默认的 磁盘缓存 。 DiskLruCacheWrapper 是一个使用 LRU 算法的固定大小的磁盘缓存。默认磁盘大小为 250 MB ,位置是在应用的 缓存文件夹 中的一个 特定目录 。

同理可更改大小:

public class YourAppGlideModule extends AppGlideModule {@Overridepublic void applyOptions(Context context, GlideBuilder builder) {int diskCacheSizeBytes = 1024  1024  100;  100 MBbuilder.setDiskCache(new InternalCacheDiskCacheFactory(context, diskCacheSizeBytes));}
}

3.9 Glide中的缓存机制

Glide里的缓存
默认情况下,Glide 会在开始一个新的图片请求之前检查以下多级的缓存:

  • 活动资源 (Active Resources) - 现在是否有另一个 View 正在展示这张图片?
  • 内存缓存 (Memory cache) - 该图片是否最近被加载过并仍存在于内存中?
  • 资源类型(Resource) - 该图片是否之前曾被解码、转换并写入过磁盘缓存?
  • 数据来源 (Data) - 构建这个图片的资源是否之前曾被写入过文件缓存

前两步检查图片是否在内存中,如果是则直接返回图片。后两步则检查图片是否在磁盘上,以便快速但异步地返回图片。

如果四个步骤都未能找到图片,则Glide会返回到原始资源以取回数据(原始文件,Uri, Url等)。

3.10 配置磁盘缓存策略

Glide 提供一系列的选项,以允许你选择加载请求与 Glide 缓存如何交互。

DiskCacheStrategy 可被 diskCacheStrategy 方法应用到每一个单独的请求。 目前支持的策略允许你阻止加载过程使用或写入磁盘缓存,选择性地仅缓存无修改的原生数据,或仅缓存变换过的缩略图,或是兼而有之。

默认的策略叫做 AUTOMATIC ,它会尝试对本地和远程图片使用最佳的策略。当你加载远程数据(比如,从URL下载)时,AUTOMATIC 策略仅会存储未被你的加载过程修改过(比如,变换,裁剪–译者注)的原始数据,因为下载远程数据相比调整磁盘上已经存在的数据要昂贵得多。

Glide.with(fragment).load(url).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);

仅从缓存加载图片

Glide.with(fragment).load(url).onlyRetrieveFromCache(true).into(imageView);

跳过缓存

Glide.with(fragment).load(url).skipMemoryCache(true).into(view);

仅跳过磁盘缓存

Glide.with(fragment).load(url).diskCacheStrategy(DiskCacheStrategy.NONE).into(view);

3.11 请求监听器

Glide.with(fragment).load(url).listener(new RequestListener() {@Overrideboolean onLoadFailed(@Nullable GlideException e, Object model,Target<R> target, boolean isFirstResource) {// Log the GlideException here (locally or with a remote logging framework):Log.e(TAG, "Load failed", e);// You can also log the individual causes:for (Throwable t : e.getRootCauses()) {Log.e(TAG, "Caused by", t);}// Or, to log all root causes locally, you can use the built in helper method:e.logRootCauses(TAG);return false; // Allow calling onLoadFailed on the Target.}@Overrideboolean onResourceReady(R resource, Object model, Target<R> target,DataSource dataSource, boolean isFirstResource) {// Log successes here or use DataSource to keep track of cache hits and misses.return false; // Allow calling onResourceReady on the Target.}}).into(imageView);

3.12 加载视频的封面到ImageView

Glide.with(MergeTestActivity.this).asBitmap().load(Uri.parse("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")).thumbnail((float) 0.3).error(R.drawable.aii).transition(BitmapTransitionOptions.withCrossFade()).into(image);

Glide图片加载框架的使用相关推荐

  1. Android Glide图片加载框架(四)回调与监听

    文章目录 Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图片加载框架(二)源码解析之with() Android Gl ...

  2. Android Glide图片加载框架(三)缓存机制

    文章目录 一.缓存简介 二.缓存用法 内存缓存方式 磁盘缓存方式 三.缓存KEY 四.内存缓存 内存缓存流程 五.磁盘缓存 磁盘缓存流程 Android Glide图片加载框架系列文章 Android ...

  3. Android Glide图片加载框架(二)源码解析之into()

    文章目录 一.前言 二.源码解析 1.into(ImageView) 2.GlideContext.buildImageViewTarget() 3.RequestBuilder.into(Targe ...

  4. Android Glide图片加载框架(二)源码解析之load()

    文章目录 一.前言 二.源码分析 1.load() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图片加载框架(二)源 ...

  5. Android Glide图片加载框架(二)源码解析之with()

    文章目录 一.前言 二.如何阅读源码 三.源码解析 1.with() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图 ...

  6. Android Glide图片加载框架(一)基本用法

    文章目录 一.前言 二.简介 三.基本用法 第一步:调用 Glide.with() 方法创建加载图片的实例 第二步:调用 load() 方法指定待加载的图片资源 第三步:调用 into() 方法绑定显 ...

  7. Android Glide 图片加载框架解析

    在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载框架,作者是  bumptech,这个库被广泛的应用在 Google 开源项目中,包括 2014 年 Google I/O ...

  8. 详谈高大上的图片加载框架Glide -源码篇

    在上篇文章中,我们介绍了Glide图片加载框架的使用,通过之前的学习,我们可能已经能熟练的将Glide图片加载框架运用到我们的项目中,但是如果有人问你它是如何加载,工作原理是怎样的?为什么自定义Gli ...

  9. 图片加载框架Glide的简单使用

    图片加载框架Glide的相关使用 一.搭建环境 1.引入依赖,设置网络权限 implementation 'com.github.bumptech.glide:glide:3.7.0' 代码实现 1. ...

最新文章

  1. 手机测试用例-设置测试用例
  2. Python进阶09 动态类型
  3. [leetcode]203. Remove Linked List Elements链表中删除节点
  4. [网络安全自学篇] 三十六.WinRAR安全缺陷复现(CVE-2018-20250)及软件自启动劫持机理
  5. 如何将SAP Multi Target应用部署到SAP云平台的Cloud Foundry环境去
  6. android camera工程师,Android从Camera中获取图片的两种方法
  7. 关于C语言中一些常用函数的说明
  8. 电机精密运动控制专家电机驱动芯片TMC260
  9. golang gzip解压
  10. 超级牛的网站同步工具软件—端端Clouduolc
  11. 笔记本升级--老华硕的升级之路
  12. 用跨进程子类化技术实现对其它进程消息的拦载
  13. 计算机实训报告心得怎么写,计算机实训报告心得体会范文_计算机实训总结怎么写...
  14. linux网络编程中端口号和ip地址转换方法
  15. Graylog服务器rpm安装
  16. gearman的安装
  17. 带滑动侧边栏的联系人界面
  18. matlab等高线图例如何显示,如何在MATLAB中的等高线图的等高线上放置字符串标签...
  19. ubuntu9.04新氧中文定制版类似ghost
  20. 二维码生成 base64格式 Java

热门文章

  1. 初级程序员 高级程序员_程序员的十大电影
  2. Deep learning based segmentation for automated training of apple trees on trellis wires
  3. Pytorch RNN 实现新闻数据分类
  4. 计算机软件水平考试都是选择题吗,计算机软考选择题多少分一道?
  5. 艾伟也谈项目管理,工作感言:任务分配及管理
  6. String转化为date类型,从而获取星期几
  7. 《西游记》中真假美猴王的分析
  8. “超限”之下,OLED迎来最好的反击
  9. 核酸检测管理系统,核酸预约系统,核酸检测预约系统毕业设计作品
  10. Devices STATUS Processing