【Android】Glide的简单使用(下)

文章目录

      • 缓存设置
      • 内存缓存
      • 硬盘缓存
      • 自定义磁盘缓存行为
      • 图片请求优先级
      • 缩略图
      • 旋转图片
      • `Glide`的回调:`Targets`
          • `BaseTarget`
          • `Target`注意事项
          • 设置具体尺寸的`Target`
      • 调试及`Debug`
          • 获取异常信息
      • 配置第三方网络库
      • 自定义缓存

缓存设置

GlideApp  .with(context).load(gifUrl).asGif().error(R.drawable.full_cake).diskCacheStrategy(DiskCacheStrategy.DATA).into(imageViewGif);

内存缓存

默认情况下不用去操作缓存设置,因为Glide默认会使用内存和硬盘缓存(所以有时候第二次加载会很快),但是如果在知道某一个图片会快速变化时,可以关闭缓存功能。

GlideApp  .with(context).load(Images[0]).skipMemoryCache(true) .into(imageView);

上面调用了.skipMemoryCache(true)方法来告诉Glide禁用内存缓存功能。这就意味着Glide不会将图片缓存到内存中,但是这只是影响内存缓存,Glide仍然会将图片缓存到硬盘中来避免下一次显示该图片时重复请求。

硬盘缓存

如上面所讲到的,即使你关闭了内存缓存,所请求的图片仍然会被保存在设备的磁盘存储上。如果你有一张不段变化的图片,但是都是用的同一个URL,你可能需要禁止磁盘缓存了。
可以用.diskCacheStrategy()方法改变Glide的行为。不同于.skipMemoryCache()方法,它将需要从枚举型变量中选择一个,而不是一个简单的boolean。如果你想要禁止请求的磁盘缓存,使用枚举型变量DiskCacheStrategy.NONE作为参数。

GlideApp  .with(context).load(Images[1]).diskCacheStrategy(DiskCacheStrategy.NONE).into(imageView);

上面的这种方式只是会禁用硬盘缓存,Glide还会使用内存缓存。

如果想把内存缓存和硬盘缓存都禁用,需要同时设置上面的两个方法

GlideApp  .with(context).load(Images[1]).diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true).into(imageView);

自定义磁盘缓存行为

如从上面提到的,Glide为硬盘缓存提供了多种设置方式。Glide的磁盘缓存是相当复杂的。例如,Picasso只缓存全尺寸图片。Glide,会缓存原始,全尺寸的图片和额外的小版本图片。例如,如果你请求一个1000x1000像素的图片,你的ImageView500x500像素,Glide会保存两个版本的图片到缓存里。

  • DiskCacheStrategy.NONE禁用硬盘缓存功能

  • DiskCacheStrategy.DATA只缓存原始的全尺寸图. 例如上面例子中1000x1000像素的图片

  • DiskCacheStrategy.RESOURCE只缓存最终剪辑转换后降低分辨的图片。例如上面离职中500x500像素的图片

  • DiskCacheStrategy.AUTOMATIC基于资源只能选择缓存策略(默认的行为)

  • DiskCacheStrategy.ALL缓存所有分辨率对应的类型的图片

图片请求优先级

Glide支持使用.priority()方法来设置图片请求的优先级,优先级高的会优先进行加载。

  • Priority.LOW

  • Priority.NORMAL

  • Priority.HIGH

  • Priority.IMMEDIATE

    GlideApp.with(context).load(image).priority(Priority.HIGH).into(imageView1);GlideApp.with(context).loadimage).priority(Priority.LOW).into(imageView2);GlideApp.with(context).load(image).priority(Priority.LOW).into(imageView3);

缩略图

缩略图不同于占位图。

占位图应当是跟app绑定在一起的资源(App本地资源drawable/Bitmap)。

缩略图是一个动态的占位图,可以从网络加载。缩略图也会被先加载,直到实际图片请求加载完毕。如果因为某些原因,缩略图获得的时间晚于原始图片,它并不会替代原始图片,而是简单地被忽略掉。

  • .thumbnail()能够让小的缩略 图平滑过渡到一个高分辨率的大图(参数为浮点乘法运算)
String imageUrl = "xxx";GlideApp  .with(context).load(imageUrl).thumbnail(0.1f).into(imageView);

例如,如果你传递一个0.1f作为参数,Glide会加载原始图片大小的10%的图片。如果原始图片有1000x1000像素,缩略图的分辨率为100x100像素。

.thumbnail()传入一个浮点类型的参数,有时不会起效。因为如果缩略图的生成也需要从网络加载同样全分辨率图片后才可以,那这样加载速度并不会比不用缩略图快。

  • 因此Glide提供了另一个方法去加载和显示缩略图。第二种方式需要传递一个新的Glide请求作为参数。

// setup Glide request without the into() method
RequestBuilder<Drawable> thumbnailRequest = GlideApp  .with(context).load(imageUrl);// pass the request as a a parameter to the thumbnail request
GlideApp  .with(context).load(imageUrl).thumbnail(thumbnailRequest).into(imageView);

区别在于第一个缩略图请求是完全独立于第二个原始请求的。缩略图可以来自不同资源或者图片URL,你可以在它上面应用不同的变换。

旋转图片

android.graphics.Matrix中,能够旋转Bitmap图片

Bitmap bitmap = ... // Bitmap的路径Matrix matrix = new Matrix();  
matrix.postRotate(rotateRotationAngle);Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);  

但是如果要在Glide中使用旋转方法,需要用BitmapTransformation()进行包裹,我们需要自定义一个类继承BitmapTransformation,//说明我们也可以实现不同的旋转方式。

public class RotateTransformation extends BitmapTransformation {private float rotateRotationAngle = 0f;public RotateTransformation(Context context, float rotateRotationAngle) {super( context );this.rotateRotationAngle = rotateRotationAngle;}@Overrideprotected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {Matrix matrix = new Matrix();matrix.postRotate(rotateRotationAngle);return Bitmap.createBitmap(toTransform, 0, 0, toTransform.getWidth(), toTransform.getHeight(), matrix, true);}@Overridepublic String getId() {return "rotate" + rotateRotationAngle;}
}

然后将上面的方法传递到.transform()中:

private void loadImageOriginal() {  Glide.with( context ).load( eatFoodyImages[0] ).into( imageView1 );
}private void loadImageRotated() {  Glide.with( context ).load( eatFoodyImages[0] ).transform( new RotateTransformation( context, 90f )).into( imageView3 );
}

Glide的回调:Targets

假设我们不想将加载的图片显示到ImageView上,而是只想得到对应的BitmapGlide提供了一种可以通过Targets获取Bitmap的方法。 Targetcallback没什么不同,都是在通过Glide的异步线程下载和处理后返回结果。

Glide提供了多个不同目的的targets,我们先从BaseTarget开始。

BaseTarget
private BaseTarget target = new BaseTarget<BitmapDrawable>() {  @Overridepublic void onResourceReady(BitmapDrawable bitmap, Transition<? super BitmapDrawable> transition) {// do something with the bitmap// for demonstration purposes, let's set it to an imageviewimageView1.setImageDrawable(bitmap);}@Overridepublic void getSize(SizeReadyCallback cb) {cb.onSizeReady(SIZE_ORIGINAL, SIZE_ORIGINAL);}@Overridepublic void removeCallback(SizeReadyCallback cb) {}
};private void loadImageSimpleTarget() {  GlideApp.with(context) // could be an issue!.load(Images[0]).into(target);
}

需要重写getSize方法,并且调用cb.onSizeReady(SIZE_ORIGINAL, SIZE_ORIGINAL);来保证Glide使用最高质量的值。当然,也可以传递一个具体的值,例如 根据View的大小返回。

Target注意事项

除了Target的回调系统,还需要注意:

  • 第一个是BaseTarget对象的定义。Java/Android可以允许在.into()内匿名定义,但这会显著增加在Glide处理完图片请求前Android垃圾回收清理匿名target对象的可能性。最终,会导致图片被加载了,但是回调永远不会被调用。所以,请确保将你的回调定义为一个字段对象,防止被万恶的Android垃圾回收给清理掉。

  • 第二个关键部分是Glide.with(context)。这个问题实际上是Glide一个特性(监听绑定活动):当你传递了一个context,例如当前appactivity,当activity停止后,Glide会自动停止当前的请求。这种整合到app生命周期内是非常有用的,但也是很难处理的。如果你的target是独立于app的生命周期。这里的解决方案是使用application的contextapp自己停止运行的时候,Glide会只取消掉图片的请求。

private void loadImageSimpleTargetApplicationContext() {  GlideApp.with(context.getApplicationContext() ) // safer!.load(Images[1]) .asBitmap().into(target2);
}
设置具体尺寸的Target

通过Target的另一个问题就是它没有具体的尺寸。如果在.into()方法的参数中传递一个ImageView,Glide会根据ImageView的大小来控制图片的尺寸。例如在加载一个1000x1000的 图片时,但是要显示到的ImageView的大小是250x250Glide会把该图片裁剪到小的尺寸来节省处理时间和内存。显示,在使用Targets时,这种方式并没有效果,因为根本不知道所需要的图片的大小。但是,如果你知道图片的最终所需要的尺寸时,你可以在callback中指定图片的尺寸来节省内存。

private BaseTarget target2 = new BaseTarget<BitmapDrawable>() {  @Overridepublic void onResourceReady(BitmapDrawable bitmap, Transition<? super BitmapDrawable> transition) {// do something with the bitmap// for demonstration purposes, let's set it to an imageviewimageView2.setImageDrawable(bitmap);}@Overridepublic void getSize(SizeReadyCallback cb) {cb.onSizeReady(250, 250);}@Overridepublic void removeCallback(SizeReadyCallback cb) {}
};private void loadImageSimpleTargetApplicationContext() {  GlideApp.with(context.getApplicationContext()) // safer!.load(eatFoodyImages[1]).into(target2);
}

通过cb.onSizeReady(250, 250);来指定尺寸。

因为该View并没有继承ImageView所以不能直接使用.into()方法。我们可以创建一个ViewTarget来替代.into()方法进行使用:

FutureStudioView customView = (FutureStudioView) findViewById( R.id.custom_view );
​
viewTarget = new ViewTarget<FutureStudioView, BitmapDrawable>(customView) {  @Overridepublic void onResourceReady(BitmapDrawable bitmap, Transition<? super BitmapDrawable> transition) {this.view.setImage(bitmap);}
};GlideApp  .with(context.getApplicationContext()) // safer!.load(eatFoodyImages[2]).into(viewTarget);

调试及Debug

可以通过adb命令来开启Glide的调试log adb shell setprop log.tag.GenericRequest DEBUG

获取异常信息

Glide不能直接通过GenericRequest类获取日志,但是我们可以获取异常信息。例如,当一个图片获取不到时,glide会抛出一个异常并且显示.error() 方法设置的错误图片。如果想明确哪里出了异常,可以通过.listener()方法传递一个listener对象进去。

首先,创建一个listener对象作为一个成员变量,避免被垃圾回收:

private RequestListener<Bitmap> requestListener = new RequestListener<Bitmap>() {  @Overridepublic boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean isFirstResource) {// todo log exception to central service or something like that// important to return false so the error placeholder can be placedreturn false;}@Overridepublic boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, DataSource dataSource, boolean isFirstResource) {// everything worked out, so probably nothing to doreturn false;}
};GlideApp  .with(context).asBitmap().load(UsageExampleListViewAdapter.eatFoodyImages[0]).listener(requestListener).error(R.drawable.cupcake).into(imageViewPlaceholder);

配置第三方网络库

  • OkHttp
// image loading library Glide
compile 'com.github.bumptech.glide:glide:4.1.1'  
annotationProcessor 'com.github.bumptech.glide:compiler:4.1.1'// Glide's OkHttp2 Integration 
compile 'com.github.bumptech.glide:okhttp-integration:4.1.1@aar'  
compile 'com.squareup.okhttp:okhttp:2.7.5'  
  • Volley没学。。
// image loading library Glide
compile 'com.github.bumptech.glide:glide:4.1.1'  
annotationProcessor 'com.github.bumptech.glide:compiler:4.1.1'
​
// Glide's Volley Integration 
compile 'com.github.bumptech.glide:volley-integration:4.1.1@aar'  
compile 'com.android.volley:volley:1.0.0'  
  • OkHttp3
// image loading library Glide
compile 'com.github.bumptech.glide:glide:4.1.1'  
annotationProcessor 'com.github.bumptech.glide:compiler:4.1.1'
​
// Glide's OkHttp3 Integration 
compile 'com.github.bumptech.glide:okhttp3-integration:4.1.1@aar'  
compile 'com.squareup.okhttp3:okhttp:3.8.1'  

自定义缓存

不会。。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/211066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL_7.索引概述

1.什么是索引 在关系数据库中&#xff0c;索引是一种单独的、物理的数对数据库表中一列或多列的值进行排序的一种存储结构。 它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单 2.索引的优点 (1)通过创建唯一性索引,可以保证数据库表中每…

编写Yaml文件当Poc,利用Nuclei扫描器去扫描漏洞

编写Yaml文件当Poc,利用Nuclei扫描器去扫描漏洞 YAML是一种数据序列化语言&#xff0c;它的基本语法规则注意如下&#xff1a; -大小写敏感 -使用缩进表示层级关系 -缩进时不允许使用Tab键&#xff0c;只允许使用空格。 -缩进的空格数目不重要&#xff0c;只要相同层级的元…

VSCode如何设置Vue前端的debug调试

vscode在调试vue.代码时&#xff0c;如何进行debug? 1.安装Chrome Debug插件。 2.在launch.json中&#xff0c;将url修改成你前端项目的路径&#xff1a; 1 {2 // Use IntelliSense to learn about possible attributes.3 // Hover to view descriptions of existing att…

redis 三主三从高可用集群docker swarm

由于数据量过大&#xff0c;单个Master复制集难以承担&#xff0c;因此需要对多个复制集进行集群&#xff0c;形成水平扩展每个复制集只负责存储整个数据集的一部分&#xff0c;这就是Redis的集群&#xff0c;其作用是提供在多个Redis节点间共享数据的程序集。 官网介绍地址 re…

Elasticsearch:向量数据库的真相

通过工作示例了解什么是向量数据库、它们如何实现 “相似性” 搜索以及它们可以在明显的 LLM 空间之外的哪些地方使用。除非你一直生活在岩石下&#xff0c;否则你可能听说过诸如生成式人工智能和大型语言模型&#xff08;LLM&#xff09;之类的术语。 除此之外&#xff0c;你很…

如何利用Axure制作移动端产品原型

Axure是一款专业的快速原型设计工具&#xff0c;作为专业的原型设计工具&#xff0c;Axure 能够快速、高效地创建原型&#xff0c;同时支持多人协作设计和版本控制管理。它已经得到了许多大公司的采用&#xff0c;如IBM、微软、思科、eBay等&#xff0c;这些公司都利用Axure 进…

android 13.0 Settings去掉二级三级菜单搜索功能

1.概述 在13.0的系统rom定制化开发中,由于客户定制开发需求,需要去掉Settings里面的搜索功能,主页面的搜索功能,在前面的章节已经讲了 这里需要去掉二级三级菜单的搜索功能,需要从搜索功能流程分析去掉搜索功能 2.Settings去掉二级三级菜单搜索功能核心代码 packages/ap…

stl模板库成员函数重载类型混肴编译不通过解决方法

stl模板库成员函数重载类型混肴编译不通过解决方法 这种方式编译不通过IsArithmetic和HasMemberList编译器存在混肴 template <typename T, typename Enable std::enable_if<IsArithmetic<T>::value>::type >static void DumpWrapper(T* filed, std::strin…

SAP UI5 walkthrough step7 JSON Model

这个章节&#xff0c;帮助我们理解MVC架构中的M 我们将会在APP中新增一个输入框&#xff0c;并将输入的值绑定到model&#xff0c;然后将其作为描述&#xff0c;直接显示在输入框的右边 首先修改App.controllers.js webapp/controller/App.controller.js sap.ui.define([&…

python变量的命名和使用

变量名只能包含字母、数字和下划线 变量名只能包含字母、数字和下划线。变量名可以字母或下划线打头&#xff0c;但不能以数字打头。例如&#xff0c;可将变量命名为message_1&#xff0c;但不能将其命名为1_message。 Python 语言中&#xff0c;以下划线开头的标识符有特殊含…

Redis server启动源码

入口main函数 src/redis.c文件main函数 int main(int argc, char **argv) {struct timeval tv;/* We need to initialize our libraries, and the server configuration. */// 初始化库 #ifdef INIT_SETPROCTITLE_REPLACEMENTspt_init(argc, argv); #endif//设置本地时间setl…

翻译: 生成式人工智能的经济潜力 第3部分工作和生产力的影响 The economic potential of generative AI

麦肯锡报告 翻译: 生成式人工智能的经济潜力 第一部分商业价值 The economic potential of generative AI翻译: 生成式人工智能的经济潜力 第2部分行业影响 The economic potential of generative AI 1. 工作和生产力的影响 技术几十年来一直在改变工作的解剖学。多年来&…

vue全屏事件与关闭全屏事件

首先&#xff0c;在 Vue 组件中&#xff0c;可以使用 click 或者 v-on 来监听点击事件&#xff0c;然后通过调用相应的方法来触发全屏或关闭全屏。 执行requestFullscreen事件 <template><div><button click"enterFullScreen">进入全屏</butt…

前端知识(十二)———ES6迭代器

ES6中的迭代器是一种新的对象&#xff0c;它具有一个next()方法。next()方法返回一个对象&#xff0c;这个对象包含两个属性&#xff1a;value和done。value属性是迭代器中的下一个值&#xff0c;done属性是一个布尔值&#xff0c;表示迭代器是否已经遍历完所有的值。迭代器是一…

js实现在线预览(PC)图片(jpg、png)、pdf、excel(xlsx)、docx

js实现图片预览 参考&#xff1a;添加链接描述 图片预览 本来用的是element-plus自带的组件el-image&#xff0c;但是去不掉缩略图&#xff0c;所以换成了el-imag-viewer组件&#xff08;图片可拖拽&#xff09;&#xff0c;由于用的vite没有require方法&#xff0c;需要自己处…

c++新经典模板与泛型编程:const修饰符的移除与增加

const修饰符的移除 让你来写移除const修饰符&#xff0c;你会怎么样来写&#xff1f; &#x1f602;&#x1f602;trait类模板&#xff0c;如下 #include <iostream>// 泛化版本 template<typename T> struct RemoveConst {using type T; };// 特化版本 template…

docker-compose 常用命令和指令

目录 1. 概要 2. 常用的docker-compose命令 2.1、image 2.2、build 2.3、command 2.4、links 2.5、external_links 2.6、ports 1.7、expose 1.8、volumes 1.9、volumes_from 1.10、environment 1.11、networks 1. 概要 默认的模板文件是 docker-compose.yml&…

阿里云(云服务器)上搭建项目部署环境

目录 安装docker docker安装MySQL5.7.37 安装MySQL 方式一&#xff1a;docker中MySQL时区调整 方式二&#xff1a;docker中MySQL时区调整 docker安装MySQL8.0.27 docker安装redis5.0.14 云服务器上安装jdk1.8 安装docker 1、先卸载docker&#xff0c;因为有一些服务器…

西南科技大学C++程序设计实验十(函数模板与类模板)

一、实验目的 1. 掌握函数模板与类模板; 2. 掌握数组类、链表类等线性群体数据类型定义与使用; 二、实验任务 1. 分析完善以下程序,理解模板类的使用: (1)补充类模板声明语句。 (2)创建不同类型的类对象,使用时明确其数据类型? _template<typename T>__…

c-语言->数据在内存的存储

系列文章目录 文章目录 系列文章目录前言 前言 目的&#xff1a;学习整数在内存的储存&#xff0c;什么是大小端&#xff0c;浮点数的储存。 1. 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们就讲过了下⾯的内容&#xff1a; 整数的2进制表⽰⽅法有三种&#xff0…