glide使用:
第一步:
添加依赖:
dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
}
第二步:添加代码混淆(可加可不加)
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
# for DexGuard only
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule
第三步:
添加权限
<uses-permission android:name="android.permission.INTERNET" />
第四步:
Glide的常用方式:
String url = "";//图片地址
Glide.with(this)
.load(url)
.asBitmap()
//.asGif()//和asBitmap()方法不能同时使用
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.skipMemoryCache(false)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.override(100,100)
.into(iv);
下面具体讲解传入的参数的作用:
- with方法的this,可以传入Activity,或者fragment,或者Application
如果传入的是Activity,如果在Activity销毁的时候,如果图片还未加载出来,则会自动取消
如果传入的是Fragment,则如果Fragment销毁时,如果图片还未加载完成,则会自动取消
如果传入Application,则图片即使在Activity或者Fragment中,当Activity或者Fragment销毁时,图片如果未加载完成,则不会取消。
Glide错误IllegalArgumentException You cannot start a load for a destroyed activity
http://appblog.cn/2018/11/04/Glide%E9%94%99%E8%AF%AFIllegalArgumentException%20You%20cannot%20start%20a%20load%20for%20a%20destroyed%20activity/
参考
https://github.com/bumptech/glide/issues/803
Glide加载图片时,报You cannot start a load for a destroyed activity的解决方案:
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
public boolean isValidContextForGlide(final Context context) {
if (context == null) {
return false;
}
if (context instanceof Activity) {
final Activity activity = (Activity) context;
if (activity.isDestroyed() || activity.isFinishing()) {
return false;
}
}
return true;
}
-
load方法的url:图片的地址
-
asGif()方法表示指定加载的图是动图(和asBitmap方法不能同时使用)
如果图片url地址指向的是静图,则加载失败。 -
asBitmap()方法表示指定加载的图是静图(和asGif方法不能同时使用)
如果图片url地址指向的是动图,则加载动图的第一帧。 -
placeholder()方法传入的图片的id或者drawable,表示的是占位图
-
error()方法传入图片的id,或者drawable,表示图片加载失败后显示的图片
-
skipMemoryCache()方法表示是否禁用内存缓存
-
diskCacheStrategy()方法,可以传入四个常量:
DiskCacheStrategy.ALL 表示既缓存原图也缓存缩放图
DiskCacheStrategy.NONE 表示不缓存
DiskCacheStrategy.SOURCE 表示仅仅缓存原图
DiskCacheStrategy.RESULT 表示仅仅缓存缩放图(默认选项) -
override(100,100)方法传入指定图片的大小, 也就是说,Glide现在只会将图片加载成100*100像素的尺寸,
而不会管你的ImageView的大小是多少了 -
into()方法中传入要显示的图片的控件
以上就是Glide一般使用到的方法。其中,如果skipMemoryCache(false)和diskCacheStrategy(DiskCacheStrategy.RESULT)这两个方法不进行显示调用,则默认是进行内存缓存和磁盘缓存的,并且磁盘缓存的是缩放图。
当然还有其他方法:
-
priority(Priority.NORMAL) 这个方法,可以指定加载的线程优先级
优先级,Priority.IMMEDIATE,Priority.HIGH,Priority.NORMAL(default),Priority.LOW -
crossFade()/crossFade(int duration) 加载时淡入淡出动画时间,也可以不传,version 3.6.1后默认开启300毫秒
-
dontAnimate():移除所有的动画
-
animate(): 指定加载动画
-
thumbnail(): 缩略图
//原图和缩略图都是同一个,但是缩略图显示的是原始的十分之一
//注意仔细观察左上角,有个很小的缩略图闪现出来后,就立刻显示转换后的尺寸
//传入0.1f,表示缩略图显示的是原图的十分之一
String url6 = "https://up.sc.enterdesk.com/edpic/cf/3e/84/cf3e8415383e065b0fe8938f73bedf70.jpg";
Glide.with(this)
.load(url6)
.error(R.drawable.msg_status_send_error)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.thumbnail(0.1f)
.into(iv);
//或者单独指定一个缩略图
String thumbnailUrl = "https://up.sc.enterdesk.com/edpic/c1/2a/ef/c12aef2b3ce6fbccc770a3524e8fe87f.jpg";
DrawableRequestBuilder requestBuilder = Glide.with(this).load(thumbnailUrl);
String url7 = "https://up.sc.enterdesk.com/edpic/cf/3e/84/cf3e8415383e065b0fe8938f73bedf70.jpg";
Glide.with(this)
.load(url7)
.error(R.drawable.msg_status_send_error)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.thumbnail(requestBuilder)
.into(iv);
-
fallback(Drawable drawable):设置model为空时显示的Drawable
-
using() :为单个的请求指定一个 model
-
Glide.get(this).clearDiskCache() 清理磁盘缓存,需要在子线程中执行
-
Glide.get(this).clearMemory() 清理内存缓存,可以直接在主线程执行
还有其他高级用法,后面在介绍。
参考: