Glide使用总结

文章详细介绍了Glide库在处理带有token的URL、图片加载到不同控件、预加载、下载、图形变换、监听加载状态以及面试备考中的应用。作者提供了解决实际问题的方法和最佳实践,适合Android开发者提升技能。
摘要由CSDN通过智能技术生成

10、当引用的 url 存在 token 时解决方法–>重写 Glide 的 GlideUrl 方法

public class MyGlideUrl extends GlideUrl {

private String mUrl;

public MyGlideUrl(String url) {

super(url);

mUrl = url;

}

@Override

public String getCacheKey() {

return mUrl.replace(findTokenParam(), “”);

}

private String findTokenParam() {

String tokenParam = “”;

int tokenKeyIndex = mUrl.indexOf(“?token=”) >= 0 ? mUrl.indexOf(“?token=”) : mUrl.indexOf(“&token=”);

if (tokenKeyIndex != -1) {

int nextAndIndex = mUrl.indexOf(“&”, tokenKeyIndex + 1);

if (nextAndIndex != -1) {

tokenParam = mUrl.substring(tokenKeyIndex + 1, nextAndIndex + 1);

} else {

tokenParam = mUrl.substring(tokenKeyIndex);

}

}

return tokenParam;

}

}

然后加载图片的方式为:

Glide.with(this)

.load(new MyGlideUrl(url))

.into(imageView);

11、利用Glide将图片加载到不同控件或加载成不同使用方式

(1)、拿到图片实例

//1、通过自己构造 target 可以获取到图片实例

SimpleTarget simpleTarget = new SimpleTarget() {

@Override

public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {

imageView.setImageDrawable(resource);

}

};

//2、将图片实例记载到指定的imageview上,也可以做其他的事情

public void loadImage(View view) {

String url = “http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg”;

Glide.with(this)

.load(url)

.into(simpleTarget);

}

(2)、将图片加载到任何位置

/*

*将图片加载为控件背景

*/

public class MyLayout extends LinearLayout {

private ViewTarget<MyLayout, GlideDrawable> viewTarget;

public MyLayout(Context context, AttributeSet attrs) {

super(context, attrs);

viewTarget = new ViewTarget<MyLayout, GlideDrawable>(this) {

@Override

public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {

MyLayout myLayout = getView();

myLayout.setImageAsBackground(resource);

}

};

}

public ViewTarget<MyLayout, GlideDrawable> getTarget() {

return viewTarget;

}

public void setImageAsBackground(GlideDrawable resource) {

setBackground(resource);

}

}

//引用图片到指定控件作为背景

public class MainActivity extends AppCompatActivity {

MyLayout myLayout;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

myLayout = (MyLayout) findViewById(R.id.background);

}

public void loadImage(View view) {

String url = “http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg”;

Glide.with(this)

.load(url)

.into(myLayout.getTarget());

}

}

12、Glide 实现预加载

//a、预加载代码

Glide.with(this)

.load(url)

.diskCacheStrategy(DiskCacheStrategy.SOURCE)

.preload();

//preload() 有两种重载

// 1、带有参数的重载,参数作用是设置预加载的图片大小;

//2、不带参数的表示加载的图片为原始尺寸;

//b、使用预加载的图片

Glide.with(this)

.load(url)

.diskCacheStrategy(DiskCacheStrategy.SOURCE)

.into(imageView);

切记:diskCacheStrategy() 方法内必须设置参数为:“ DiskCacheStrategy.SOURCE ”,否则可能预加载失败,导致显示图片时,需要重新加载。

13、Glide 实现图片下载

使用 downloadOnly(int width, int height)downloadOnly(Y target) 方法替代 into(view) 方法。

public void downloadImage(View view) {

new Thread(new Runnable() {

@Override

public void run() {

try {

String url = “http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg”;

final Context context = getApplicationContext();

FutureTarget target = Glide.with(context)

.load(url)

.downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);

final File imageFile = target.get();

runOnUiThread(new Runnable() {

@Override

public void run() {

Toast.makeText(context, imageFile.getPath(), Toast.LENGTH_LONG).show();

}

});

} catch (Exception e) {

e.printStackTrace();

}

}

}).start();

}

(1)、有两个参数的 downloadOnly(int width, int height) 方法表示指定下载尺寸,用于在子线程内进行下载;

(2)、一个参数的 downloadOnly(Y target) 方法 在主线程内进行下载

(3)、target.get() 方法可以获取到下载文件保存路径;

使用下载完的图片的方式

public void loadImage(View view) {

String url = “http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg”;

Glide.with(this)

.load(url)

.diskCacheStrategy(DiskCacheStrategy.SOURCE)

.into(imageView);

}

注意: diskCacheStrategy() 方法的参数应该为 DiskCacheStrategy.SOURCE 或者 DiskCacheStrategy.ALL否则可能导致加载图片到控件的时候,需要重新加载。

13、监听 Glide 加载的状态

public void loadImage(View view) {

String url = “http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg”;

Glide.with(this)

.load(url)

.listener(new RequestListener<String, GlideDrawable>() {

@Override

public boolean onException(Exception e, String model, Target target,

boolean isFirstResource) {

return false;

}

@Override

public boolean onResourceReady(GlideDrawable resource, String model,

Target target, boolean isFromMemoryCache, boolean isFirstResource) {

return false;

}

})

.into(imageView);

}

(1)、onException() 方法表示加载失败,onResourceReady() 表示加载成功;

(2)、 每个方法都有一个 boolean 的返回值,false表示未处理、true 表示处理。

14、Glide 的图形变换功能

(1)、禁用图形变换功能

Glide.with(this)

.load(url)

.dontTransform()

.into(imageView);

这个方法时全局的,导致其他地方的图片也不可进行图形变换了。

修改方法

Glide.with(this)

.load(url)

.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)

.into(imageView);

通过 override() 方法设置大小

(2)、简单的图形变换

Glide.with(this)

.load(url)

.centerCrop()

.into(imageView);

Glide.with(this)

.load(url)

.fitCenter()

.into(imageView);

通过 centerCrop()方法 按照原始的长宽比充满全屏和 fitCenter() 方法 对原图的中心区域进行裁剪对图片进行相关设置。

(3)、override() 方法与 centerCrop() 方法配合使用

String url = “http://cn.bing.com/az/hprichbg/rb/AvalancheCreek_ROW11173354624_1920x1080.jpg”;

Glide.with(this)

.load(url)

.override(500, 500)

.centerCrop()

.into(imageView);

(4)、复杂的图像变换

首先需要再引入一个 第三方框架 。

dependencies {

implementation ‘jp.wasabeef:glide-transformations:3.3.0’

// If you want to use the GPU Filters

implementation ‘jp.co.cyberagent.android.gpuimage:gpuimage-library:1.4.1’

}

其次,部分样例:

图片虚化

Glide.with(this)

.load(url)

.bitmapTransform(new BlurTransformation(this))

.into(imageView);

图片黑白化

Glide.with(this)

.load(url)

.bitmapTransform(new GrayscaleTransformation(this))

.into(imageView);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

面试复习路线,梳理知识,提升储备

自己的知识准备得怎么样,这直接决定了你能否顺利通过一面和二面,所以在面试前来一个知识梳理,看需不需要提升自己的知识储备是很有必要的。

关于知识梳理,这里再分享一下我面试这段时间的复习路线:(以下体系的复习资料是我从各路大佬收集整理好的)

  • 架构师筑基必备技能
  • Android高级UI与FrameWork源码
  • 360°全方面性能调优
  • 解读开源框架设计思想
  • NDK模块开发
  • 微信小程序
  • Hybrid 开发与Flutter

知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结:

Android开发七大模块核心知识笔记

《960全网最全Android开发笔记》

《379页Android开发面试宝典》

历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?

1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

完美的总结:

[外链图片转存中…(img-RoLypwff-1713370486174)]

《960全网最全Android开发笔记》

[外链图片转存中…(img-GeAYlxcs-1713370486175)]

《379页Android开发面试宝典》

历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?

1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

[外链图片转存中…(img-3cVsI17x-1713370486177)]

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 是的,Glide 的 `downloadOnly()` 方法已经被标记为过时。如果要下载图片而不显示它,可以使用 `download()` 方法。`download()` 方法与 `downloadOnly()` 方法的区别在于,前者会在下载完成后将图片保存到磁盘缓存中,而后者不会。 下面是使用 Glide 下载图片的示例代码: ```java Glide.with(context) .load(imageUrl) .download(new SimpleTarget<File>() { @Override public void onResourceReady(File resource, GlideAnimation<? super File> glideAnimation) { // 下载完成,resource 为保存在磁盘缓存中的文件 } }); ``` 在这个示例中,我们通过 `load()` 方法加载图片,并通过 `download()` 方法下载并保存图片。`download()` 方法的参数是一个 `SimpleTarget<File>` 对象,用于在下载完成后回调,`onResourceReady()` 方法中的 `resource` 参数即为保存在磁盘缓存中的文件。 需要注意的是,如果要使用 `download()` 方法下载图片,必须在 AndroidManifest.xml 文件中声明写入外部存储的权限: ```xml <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> ``` ### 回答2: Glide的downloadOnly()方法是用来在后台下载图片,并且不会将图片直接加载到ImageView上。然而,由于一些更新和改进,该方法已经被标记为过时。在最新版本的Glide中,使用downloadOnly()方法并不推荐,应该尽量避免使用它。 过时的原因可能是因为下载图片时,Glide提供了更多的选择和更好的性能。例如,Glide已经引入了RequestOptions类,它提供了更多的选项去控制图片下载的行为和结果。可以通过在RequestOptions中设置diskCacheStrategy()方法来指定磁盘缓存策略,这样可以更好地管理已下载的图片缓存。 另外,Glide中的新方法也提供了更好的错误处理机制。过时的downloadOnly()方法无法提供可靠的错误处理,而新的方法可以更好地处理加载过程中的异常和错误情况。 因此,建议使用新的方法来替代过时的downloadOnly()。例如,可以使用Glide的asFile()方法来直接下载图片文件,并使用diskCacheStrategy()来设置缓存策略。或者也可以使用Glide的preload()方法来预加载图片,为后续的加载操作做准备。 总之,尽量避免使用过时的downloadOnly()方法,而是使用新的方法来更好地管理和处理图片下载过程中的各种情况。 ### 回答3: Glide的downloadOnly方法是用于仅下载图片而不显示的方法,它已经被标记为过时。原因是在实际使用中发现,仅下载图片而不显示可能会导致一些问题。 首先,通过downloadOnly方法下载的图片将不会被缓存。这意味着每次你需要显示这个图片时,都需要重新下载。这不仅会消耗网络流量,还会延长图片加载的时间,并且在网络不稳定的情况下,可能导致图片无法加载成功。 其次,downloadOnly方法没有提供任何回调接口,无法处理下载过程中的异常情况。如果在下载过程中出现网络错误或其他问题,我们将无法得知并进行相应处理。 另外,Glide还提供了一种更加灵活的方式来实现图片下载和加载的功能,即使用into方法。通过into方法,我们可以指定一个用于显示图片的目标View,并在加载完成后得到相应的回调,从而可以更好地处理加载过程中的各种情况。 总结来说,Glide的downloadOnly方法被标记为过时是因为它无法处理缓存以及异常情况,并且有更加灵活的替代方案可供选择。因此,在实际使用中,建议使用更为有效和可靠的方式来进行图片下载和加载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值