项目中如何快速将Glide3替换成Glide4

我想大多数人在自己的项目中还是使用Glide3.7.1这个版本吧!不过Glide版本现在已经到4.4.0了!

当我们把Glide3更换成Glide4,会发现大部分地方都报错了,那么该怎样快速替换Glide3为Glide4呢?

下面我们一起来看看怎样实现Glide3到Glide4的快速替换。

Glide4的基本用法:

引入Glide

compiler:包含各种注解的使用,Glide3快速替换成Glide4时要用到。

添加网络权限

在这个地方可能你的项目会报个错:java.lang.NoSuchMethodError

这是因为Glide4中已经引入了appcompat-v7包,版本不一致引起。

解决方法:

Glide4.4.0引入的是27.0.2版本,所以把你项目中的appcompat-v7更换为:

implementation'com.android.support:appcompat-v7:27.0.2'

普通加载图片

Glide.with(this.getApplicationContext())

.load(url)

.into(mImage);

占位图和错误时显示图片

RequestOptions options =newRequestOptions();

options.placeholder(R.drawable.ic_launcher_background);

options.error(R.mipmap.load_error);

//禁用掉Glide的缓存功能

options.diskCacheStrategy(DiskCacheStrategy.NONE);

Glide.with(this.getApplicationContext())

.load(url)

.apply(options)

.into(mImage);

这里就是Glide4和Glide3的最大不同,他将部分API功能封装在RequestOptions 中,在通过apply方法,传递给Glide使用,这样我们就可以很方便的在需要的地方可以进行不同的配置了,不用像Glide3一样传递很多参数!

指定图片大小

RequestOptions options1 =newRequestOptions();

//指定大小为200*100

//options1.override(200, 100);

//加载一张图片的原始尺寸的图片

options1.override(Target.SIZE_ORIGINAL);

Glide.with(this.getApplicationContext())

.load(url)

//请求给定系数的缩略图。如果缩略图比全尺寸图先加载完,

// 就显示缩略图,否则就不显示。

// 系数sizeMultiplier必须在(0,1)之间,

// 可以递归调用该方法。

.thumbnail(0.1f)

.apply(options1)

.into(mImage);

禁用内存缓存&硬盘缓存功能

// DiskCacheStrategy.NONE: 表示不缓存任何内容。

// DiskCacheStrategy.DATA: 表示只缓存原始图片。

// DiskCacheStrategy.RESOURCE: 表示只缓存转换过后的图片。

// DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。

// DiskCacheStrategy.AUTOMATIC: 表示让Glide根据图片资源智能地选择使用哪一种缓存策略(默认选项)。

RequestOptions options2 =newRequestOptions()

//禁用内存缓存

.skipMemoryCache(true)

//硬盘缓存功能

.diskCacheStrategy(DiskCacheStrategy.NONE);

Glide.with(this.getApplicationContext())

.load(url)

.apply(options2)

.into(mImage);

指定加载格式GIF

Glide.with(this.getApplicationContext())

.load("file:///android_asset/jdfw.gif")

.into(mImage);

获取gif第一帧

/**

* 注意:在Glide 3中的语法是先load()再asBitmap()的,

*

* 而在Glide 4中是先asBitmap()再load()的

*

* 如果写错了顺序就肯定会报错了

*/

Glide.with(this.getApplicationContext())

//.asBitmap()//强制指定加载静态图片

//.asGif()//强制指定加载动态图片

//.asFile()//强制指定文件格式的加载

.asDrawable()//强制指定Drawable格式的加载

.load("file:///android_asset/jdfw.gif")

.into(mImage);

回调与监听

/**

* 回调与监听

*/

SimpleTargetsimpleTarget=newSimpleTarget() {

@Override

public voidonResourceReady(Drawable resource,Transition

mImage.setImageDrawable(resource);

}

};

Glide.with(this.getApplicationContext())

.load(url)

.into(simpleTarget);

预加载后显示

预加载

Glide.with(this)

.load("https://unsplash.it/200/200?random&22")

.preload();

预加载后显示

Glide.with(this.getApplicationContext())

.load("https://unsplash.it/200/200?random&22")

.into(mImage);

submit()方法:类似Glide3中的downloadOnly

newThread(newRunnable() {

@Override

public voidrun() {

try{

finalContext context = getApplicationContext();

FutureTarget target = Glide.with(context)

//.asDrawable()

.asFile()

.load(url)

.submit();

//final Drawable drawable = target.get();

finalFile imageFile = target.get();

runOnUiThread(newRunnable() {

@Override

public voidrun() {

mTextview.setText(imageFile.getPath());

}

});

}catch(Exception e) {

e.printStackTrace();

}

}

}).start();

listener()方法

Glide.with(this.getApplicationContext())

.load(url)

.listener(newRequestListener() {

@Override

public booleanonLoadFailed(@NullableGlideException e,Object model,Target target, booleanisFirstResource) {

mTextview.setText("加载失败");

return false;

}

@Override

public booleanonResourceReady(Drawable resource,Object model,Target target,DataSource dataSource, booleanisFirstResource) {

mTextview.setText("加载成功");

return false;

}

})

.into(mImage);

图片变换(圆角等)

RequestOptions options3 =newRequestOptions();

//options3.centerCrop();

// options3.fitCenter();

options3.circleCrop();

Glide.with(this.getApplicationContext())

.load("https://unsplash.it/200/200?random&55")

.apply(options3)

.into(mImage);

自定义模块

在Glide3中定义了自定义模块之后,还必须在AndroidManifest.xml文件中去注册它才能生效,而在Glide 4中是不需要的,因为@GlideModule这个注解已经能够让Glide识别到这个自定义模块了(记得Build -> Rebuild Project)!

packagetsou.com.simple.glide4test.glidemodule;

importandroid.content.Context;

importcom.bumptech.glide.Glide;

importcom.bumptech.glide.GlideBuilder;

importcom.bumptech.glide.Registry;

importcom.bumptech.glide.annotation.GlideModule;

importcom.bumptech.glide.load.DecodeFormat;

importcom.bumptech.glide.load.engine.cache.ExternalPreferredCacheDiskCacheFactory;

importcom.bumptech.glide.module.AppGlideModule;

/**

* Created by Administrator on 2017/12/22 0022.

* 在Glide3中需要在AndroidManifest.xml中配置

*

* Glide4,只要有@GlideModule注解就好

*/

@GlideModule

public classMyAppGlideModuleextendsAppGlideModule {

public static final intDISK_CACHE_SIZE=500*1024*1024;

public static finalStringDISK_CACHE_NAME="huangxiaoguo";

@Override

public voidapplyOptions(Context context,GlideBuilder builder) {

super.applyOptions(context,builder);

/**

将所有Glide加载的图片缓存到SD卡上,

默认硬盘缓存大小都是250M,这里改为500

* */

//builder.setDiskCache(new ExternalCacheDiskCacheFactory(context));

/**

ExternalCacheDiskCacheFactory的默认缓存路径

是在sdcard/Android/data/包名/cache/image_manager_disk_cache目录当中

*/

//builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, DISK_CACHE_SIZE));

/**

* 更改缓存最总文件夹名称

*

* 是在sdcard/Android/data/包名/cache/DISK_CACHE_NAME目录当中

*/

//此方法在Glide4已过时

// builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, DISK_CACHE_NAME, DISK_CACHE_SIZE));

builder.setDiskCache(newExternalPreferredCacheDiskCacheFactory(context,DISK_CACHE_NAME,DISK_CACHE_SIZE));

/**

* Glide也能使用ARGB_8888的图片格式

* 虽然图片质量变好了,但同时内存开销也会明显增大

*/

builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);

}

@Override

public voidregisterComponents(Context context,Glide glide,Registry registry) {

super.registerComponents(context,glide,registry);

}

}

默认缓存路径

设置缓存路径为SD卡

Glide3替换成Glide4(Generated API)

在自定义模块完成以后,就可以使用Glide的模式啦!请看:

//使用Generated API(类似Glide3用法)

//使用GlideApp,首先确保你的代码中有一个自定义的模块,

// 并且给它加上了@GlideModule注解,也就是自定义模块

GlideApp.with(this.getApplicationContext())

.load(url)

.placeholder(R.drawable.ic_launcher_background)

.error(R.mipmap.load_error)

.skipMemoryCache(true)//清除缓存

.diskCacheStrategy(DiskCacheStrategy.NONE)//表示既缓存原始图片,也缓存转换过后的图片

.override(Target.SIZE_ORIGINAL)

.circleCrop()//切圆

.into(mImage);

把之前Glide替换成GlideApp,就可以使用Glide3的方式进行使用了!是不是很方便!

定制自己的API

定制自己的API需要借助@GlideExtension和@GlideOption这两个注解。创建一个我们自定义的扩展类

packagetsou.com.simple.glide4test.glidemodule;

importcom.bumptech.glide.annotation.GlideExtension;

importcom.bumptech.glide.annotation.GlideOption;

importcom.bumptech.glide.load.engine.DiskCacheStrategy;

importcom.bumptech.glide.request.RequestOptions;

importtsou.com.simple.glide4test.R;

/**

* Created by Administrator on 2017/12/25 0025.

*/

@GlideExtension

public classMyGlideExtension {

/**

* 将这个类的构造函数声明成private,这是必须要求的写法

*/

privateMyGlideExtension() {

}

@GlideOption

public static voidmyGlideConfiguration(RequestOptions options) {

//占位图

options.placeholder(R.drawable.ic_launcher_background);

//错误图片

options.error(R.mipmap.load_error);

//表示只缓存原始图片

options.diskCacheStrategy(DiskCacheStrategy.DATA);

//切圆

options.circleCrop();

//...等等所有的属性

}

}

使用自定义API方式

GlideApp.with(this.getApplicationContext())

.load(url)

.myGlideConfiguration()//自定义API

.into(mImage);

这样,我们就可以直接使用自己的API了,同时所有的Glide配置都在MyGlideExtension 进行配置,方便项目中的同意修改!

到此Glide4的基本使用到此结束,希望对你有所帮助!

同时欢迎大家的指教,谢谢!

Demo地址:http://download.csdn.net/download/huangxiaoguo1/10172358

Glide4的使用方式虽然和Glide3不同,但是主要的功能却和Glide3一样,其他关于Glide4的功能在这里没有详细给出,需要了解,请看:

本文来自企鹅号 - 黄小贝媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Kubernetes

深入分析Kubernetes Scheduler的优先级队列

从1.9版本开始,Kubernetes实现了基于Pod优先级的调度队列,一方面提供高优先级的Pod优先被调度的能力,另一方面减轻抢占式调度时潜在的High Pr...

81870
来自专栏Kubernetes

Kubernetes如何通过Devi

Device Plugins Device Pulgins在Kubernetes 1.10中是beta特性,开始于Kubernetes 1.8,用来给第三方设备...

56880
来自专栏郭霖

Android图片加载框架最全解析(八),带你全面了解Glide 4的用法

本篇将是我们这个Glide系列的最后一篇文章。 其实在写这个系列第一篇文章的时候,Glide就推出4.0.0的RC版了。那个时候因为我一直研究的都是Glide ...

97670
来自专栏乐沙弥的世界

Linux script 命令记录(数据库)操作步骤

    对DBA而言,经常碰到升级数据库或是apply patch,以及有些时候需要运行大量的脚本。对于这些操作我们希望现在在屏幕同时又输出的文件以备后续查询过...

16540
来自专栏比原链

Bytom移动端钱包SDK开发基础

Gitee地址:https://gitee.com/BytomBlockchain/bytom

13210
来自专栏草根专栏

从头编写 asp.net core 2.0 web api 基础框架 (3)

Github源码地址:https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-...

51470
来自专栏FreeBuf

远程RPC溢出EXP编写实战之MS06-040

0x01 前言 MS06-040算是个比较老的洞了,在当年影响十分之广,基本上Microsoft大部分操作系统都受到了影响,威力不亚于17年爆出的”永恒之蓝”漏...

340100
来自专栏比原链

Bytom移动端钱包SDK开发基础

Gitee地址:https://gitee.com/BytomBlockchain/bytom

15140
来自专栏ml

unbuntu系统( PC机 )中安装360wifi步骤

少说废话,每一步都经过验证:   1.  首先查看一下当前使用的linux版本: gxjun@gxjun:~$ uname -r 4.8.0-59-generi...

36630
来自专栏Golang语言社区

写在学习golang一个月后

连接池。由于PHP没有连接池,当高并发时就会有大量的数据库连接直接冲击到MySQL上,最终导致数据库挂掉。虽然Swoole有连接池,但是Swoole只是PHP的...

29720

扫码关注云+社区

领取腾讯云代金券