Glide图片加载框架的使用
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
,以最小化昂贵的垃圾回收和堆碎片影响; - 深度的生命周期集成,以确保仅优先处理活跃的
Fragment
和Activity
的请求,并有利于应用在必要时释放资源以避免在后台时被杀掉。
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
,后备回调符,默认情况下Glide
将null
作为错误处理,所以可以接受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
的大小由 Glide
的 MemorySizeCalculator
类来决定,这个类主要关注设备的内存类型,设备 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图片加载框架的使用相关推荐
- Android Glide图片加载框架(四)回调与监听
文章目录 Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图片加载框架(二)源码解析之with() Android Gl ...
- Android Glide图片加载框架(三)缓存机制
文章目录 一.缓存简介 二.缓存用法 内存缓存方式 磁盘缓存方式 三.缓存KEY 四.内存缓存 内存缓存流程 五.磁盘缓存 磁盘缓存流程 Android Glide图片加载框架系列文章 Android ...
- Android Glide图片加载框架(二)源码解析之into()
文章目录 一.前言 二.源码解析 1.into(ImageView) 2.GlideContext.buildImageViewTarget() 3.RequestBuilder.into(Targe ...
- Android Glide图片加载框架(二)源码解析之load()
文章目录 一.前言 二.源码分析 1.load() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图片加载框架(二)源 ...
- Android Glide图片加载框架(二)源码解析之with()
文章目录 一.前言 二.如何阅读源码 三.源码解析 1.with() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图 ...
- Android Glide图片加载框架(一)基本用法
文章目录 一.前言 二.简介 三.基本用法 第一步:调用 Glide.with() 方法创建加载图片的实例 第二步:调用 load() 方法指定待加载的图片资源 第三步:调用 into() 方法绑定显 ...
- Android Glide 图片加载框架解析
在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载框架,作者是 bumptech,这个库被广泛的应用在 Google 开源项目中,包括 2014 年 Google I/O ...
- 详谈高大上的图片加载框架Glide -源码篇
在上篇文章中,我们介绍了Glide图片加载框架的使用,通过之前的学习,我们可能已经能熟练的将Glide图片加载框架运用到我们的项目中,但是如果有人问你它是如何加载,工作原理是怎样的?为什么自定义Gli ...
- 图片加载框架Glide的简单使用
图片加载框架Glide的相关使用 一.搭建环境 1.引入依赖,设置网络权限 implementation 'com.github.bumptech.glide:glide:3.7.0' 代码实现 1. ...
最新文章
- 手机测试用例-设置测试用例
- Python进阶09 动态类型
- [leetcode]203. Remove Linked List Elements链表中删除节点
- [网络安全自学篇] 三十六.WinRAR安全缺陷复现(CVE-2018-20250)及软件自启动劫持机理
- 如何将SAP Multi Target应用部署到SAP云平台的Cloud Foundry环境去
- android camera工程师,Android从Camera中获取图片的两种方法
- 关于C语言中一些常用函数的说明
- 电机精密运动控制专家电机驱动芯片TMC260
- golang gzip解压
- 超级牛的网站同步工具软件—端端Clouduolc
- 笔记本升级--老华硕的升级之路
- 用跨进程子类化技术实现对其它进程消息的拦载
- 计算机实训报告心得怎么写,计算机实训报告心得体会范文_计算机实训总结怎么写...
- linux网络编程中端口号和ip地址转换方法
- Graylog服务器rpm安装
- gearman的安装
- 带滑动侧边栏的联系人界面
- matlab等高线图例如何显示,如何在MATLAB中的等高线图的等高线上放置字符串标签...
- ubuntu9.04新氧中文定制版类似ghost
- 二维码生成 base64格式 Java
热门文章
- 初级程序员 高级程序员_程序员的十大电影
- Deep learning based segmentation for automated training of apple trees on trellis wires
- Pytorch RNN 实现新闻数据分类
- 计算机软件水平考试都是选择题吗,计算机软考选择题多少分一道?
- 艾伟也谈项目管理,工作感言:任务分配及管理
- String转化为date类型,从而获取星期几
- 《西游记》中真假美猴王的分析
- “超限”之下,OLED迎来最好的反击
- 核酸检测管理系统,核酸预约系统,核酸检测预约系统毕业设计作品
- Devices STATUS Processing