项目中如何快速将Glide3替换成Glide4
来源:互联网 发布:bind源码 内网dns 编辑:程序博客网 时间:2024/06/11 01:41
我想大多数人在自己的项目中还是使用Glide3.7.1这个版本吧!不过Glide版本现在已经到4.4.0了!
当我们把Glide3更换成Glide4,会发现大部分地方都报错了,那么该怎样快速替换Glide3为Glide4呢?
下面我们一起来看看怎样实现Glide3到Glide4的快速替换。
Glide4的基本用法:
- 引入Glide
implementation 'com.github.bumptech.glide:glide:4.4.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.4.0'
compiler:包含各种注解的使用,Glide3快速替换成Glide4时要用到。
- 添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
在这个地方可能你的项目会报个错:java.lang.NoSuchMethodError
这是因为Glide4中已经引入了appcompat-v7包,版本不一致引起。
解决方法:
Glide4.4.0引入的是27.0.2版本,所以把你项目中的appcompat-v7更换为:
implementation 'com.android.support:appcompat-v7:27.0.2'
详细请看:Glide4.4.0报java.lang.NoSuchMethodError
- 普通加载图片
Glide.with(this.getApplicationContext()) .load(url) .into(mImage);
- 占位图和错误时显示图片
RequestOptions options = new RequestOptions(); 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 = new RequestOptions(); //指定大小为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 = new RequestOptions() //禁用内存缓存 .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);
- 回调与监听
/** * 回调与监听 */ SimpleTarget<Drawable> simpleTarget = new SimpleTarget<Drawable>() { @Override public void onResourceReady(Drawable resource, Transition<? super Drawable> 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
new Thread(new Runnable() { @Override public void run() { try { final Context context = getApplicationContext(); FutureTarget<File> target = Glide.with(context) //.asDrawable() .asFile() .load(url) .submit(); //final Drawable drawable = target.get(); final File imageFile = target.get(); runOnUiThread(new Runnable() { @Override public void run() { mTextview.setText(imageFile.getPath()); } }); } catch (Exception e) { e.printStackTrace(); } } }).start();
- listener()方法
Glide.with(this.getApplicationContext()) .load(url) .listener(new RequestListener<Drawable>() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) { mTextview.setText("加载失败"); return false; } @Override public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { mTextview.setText("加载成功"); return false; } }) .into(mImage);
- 图片变换(圆角等)
RequestOptions options3 = new RequestOptions(); //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)!
package tsou.com.simple.glide4test.glidemodule;import android.content.Context;import com.bumptech.glide.Glide;import com.bumptech.glide.GlideBuilder;import com.bumptech.glide.Registry;import com.bumptech.glide.annotation.GlideModule;import com.bumptech.glide.load.DecodeFormat;import com.bumptech.glide.load.engine.cache.ExternalPreferredCacheDiskCacheFactory;import com.bumptech.glide.module.AppGlideModule;/** * Created by Administrator on 2017/12/22 0022. * 在Glide3中需要在AndroidManifest.xml中配置 * <p> * Glide4,只要有@GlideModule注解就好 */@GlideModulepublic class MyAppGlideModule extends AppGlideModule { public static final int DISK_CACHE_SIZE = 500 * 1024 * 1024; public static final String DISK_CACHE_NAME = "huangxiaoguo"; @Override public void applyOptions(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(new ExternalPreferredCacheDiskCacheFactory(context, DISK_CACHE_NAME, DISK_CACHE_SIZE)); /** * Glide也能使用ARGB_8888的图片格式 * 虽然图片质量变好了,但同时内存开销也会明显增大 */ builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888); } @Override public void registerComponents(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这两个注解。创建一个我们自定义的扩展类
package tsou.com.simple.glide4test.glidemodule;import com.bumptech.glide.annotation.GlideExtension;import com.bumptech.glide.annotation.GlideOption;import com.bumptech.glide.load.engine.DiskCacheStrategy;import com.bumptech.glide.request.RequestOptions;import tsou.com.simple.glide4test.R;/** * Created by Administrator on 2017/12/25 0025. */@GlideExtensionpublic class MyGlideExtension { /** * 将这个类的构造函数声明成private,这是必须要求的写法 */ private MyGlideExtension() { } @GlideOption public static void myGlideConfiguration(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的功能在这里没有详细给出,需要了解,请看:
整理Glide方法使用含义(毛玻璃效果,实现圆角等)
Glide使用高级技巧(解决Glide生成缓存Key问题)
Android图片加载框架:玩转Glide的回调与监听
android自定义Glide图片加载(以更改Glide缓存路径和使用ARGB_8888的图片格式为例)
android替换Glide通讯组件为Okhttp并监控加载进度