关于glide的前世今生,相信每一个搞Android开发的小伙伴都不会陌生,这里我也就不多做叙述了,不了解的小伙伴,可以先阅读https://github.com/bumptech/glide
这篇博客主要是讲Glided的版本从v3升级到v4后,一些方法及使用规则的改动
- 常规使用
通常,glide被使用的最多的无疑是with+load+into的组合:
Glide.with(mContext).load(file).into(viewHolder.albumimag);
对于这个大众通用的方法,版本升级后并没有做出大的改动
- 其他扩展性的方法
glide之所以受大众喜爱,能在诸如imageloader,picasso,等诸多高手中杀出一条血路,当然有自己的杀手锏了,除了上面的常规用法外,glide还有其他诸多用法,如
Glide.with(mContext).load(file).diskCacheStrategy(DiskCacheStrategy.SOURCE).into(viewHolder.albumimag);
Glide.with(mContext)
.load(bitmaps.get(position % bitmaps.size()))
.placeholder(R.drawable.loading)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(imageView);
Glide.with(context).load(images.get(position)).asBitmap().into(new MyTarget(photoViewAttacher));
Glide.with(context)
.load(contentEntity.getIcon())
.placeholder(R.drawable.loading)
.transform(new CircleTransform(context))
.into(topicImgView.getBinding().ivTopicDetailHeader);
方法众多,用法不一,这里就不逐一列举了,不过从上面几个的用法中,不难发现,所有的方法都采取的时方便的链式编程,不过,自从Glide的版本从v3升级到v4后,你或许会神奇的发现,整个项目中突然报出了一大片红.
WTF?是不是当场懵逼了?开始怀疑人生了?刚才还好端端的代码怎么突然就报错了?难道是长时间的超负荷工作导致眼花了?…
NO!NO!NO!都不是,少年,这不是你的错!而是Glide从V3升级到V4了!
最好的解决办法是什么,难不成要把刚替换完成的依赖重新变回到以前的版本
compile 'com.github.bumptech.glide:glide:4.0.0-RC1'
当然,这也未尝不可,不过,作为一只有探索精神的程序猿,你真的甘心吗?
既然不甘心,那么就让我们一起来看看V4版的glide都做了哪些变动
先看github上的解释
Migrating from v3 to v4:http://bumptech.github.io/glide/doc/migrating.html
从官方的说法来看,主要有三个大的模块做出了变动
1. Options
- RequestBuilder
RequestOptions
TransitionOptions
Generated API
2. Types and Targets
- Picking Resource
- Types Drawables
- Targets
- Cancellation
3.Configuration
- Applications
- Libraries
- Manifest parsing
RequestBuilder
指定加载类型。asBitmap()、asGif()、asDrawable()、asFile()。
指定要加载url/model。
指定要加载到那个View。
指定要应用的RequestOption
指定要应用的TransitionOption
指定要加载的缩略图
RequestOptions的API
centerCrop()
placeholder()
error()
priority()
diskCacheStrategy()
也就是说以前可以链式编程的方法都被封装起来了,所以升级后找不到了,自然也就会报错了
既然封装了,就可以利用这个类来调用了
具体的用法如:
Glide.with(context)
.load(itemsBean.getUicon())
.apply(new RequestOptions().placeholder(R.drawable.loading).transform(new CircleTransform(context)))
.into(holder.getBinding().ivCommentDalHeader);
TransitionOptions包含三个子类:
- GenericTransitionOptions
- DrawableTransitionOptions
- BitmapTransitionOptions
移除默认的transition,使用TransitionOptions.dontTransition()
用法如下
Glide.with(fragment)
.load(url)
.transition(withCrossFade(R.anim.exent, 300));
Generated API
这个可就有意思了,因为用到了注解的方式,你懂得
- 运用程序中应该创建一个带有@GlideModule注解的AppGlideModule子类,来使用generated APIGenerated API添加一个GlideApp类,该类能够提供对RequestBuilder和RequestOptions子类的访问。RequestOptions子类包含RequestOptions包含的全部方法和GlideExtensions定义的方法。RequestBuilder子类不需要使用apply方法,来访问RequestBuilder子类中全部方法
如:
@GlideModule
public class CustomGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
int memoryCacheSizeBytes = 1024 * 1024 * 20; // 20mb
builder.setMemoryCache(new LruResourceCache(memoryCacheSizeBytes));
}
}
具体可以参照http://sjudd.github.io/glide/doc/generatedapi.html
当然,使用GlideApp,需要添加annotationProcessor 的依赖
annotationProcessor 'com.github.bumptech.glide:compiler:4.0.0-RC0'
使用GlideAPI
GlideApp.with(fragment)
.load(url)
.centerCrop()
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.priority(Priority.HIGH)
.into(imageView);
不使用时
Glide.with(fragment)
.load(url)
.apply(centerCropTransform()
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.priority(Priority.HIGH))
.into(imageView);
大家发现有什么不同了吗?
没错! 使用GlideAPI时RequestOptions被内嵌调用了
Types and Targets
- 在使用Glide时,可以指定你想加载的资源类型。倘若你指定了一个超类的类型,Glide将尝试加载一个可用的子类类型。例如,指定加载类型是Drawable,Glide会加载BitmapDrawable或者GifDrawable。
Configuration
- 在Glide v3中,使用一个或者多个GlideModules来执行配置,但升级到V4后,配置发生了一些改变,具体可以参考
http://sjudd.github.io/glide/doc/configuration.html
Applications
- 若是运用程序中具备多个GlideModules,将其中一个转成AppGlideModule,其他的转成LibraryGlideModules。倘若,存在AppGlideModule的时候,才会发现LibraryGlideModule。因此,不能仅适用LibraryGlideModules
Libraries
- 拥有一个或者多个的GlideModule的库应该使用LibraryGlideModule而不是AppGlideModule。库不应是使用AppGlideModules,因为每个运用程序只有一个AppGliModules。因此,包含在唯一一个库的AppGlideModules,不会阻止库去设置库本身的options。多个库包含一个AppGlideMoudle,它会导致冲突。
好了,到这里就结束了,如果想了解更多,可以参考github上的官方文档
资源参考:
- Glide框架:http://blog.csdn.net/hexingen/article/details/72577453
- Migrating from v3 to v4:http://bumptech.github.io/glide/doc/migrating.html
- Generated API http://sjudd.github.io/glide/doc/generatedapi.html
- Configuration http://sjudd.github.io/glide/doc/configuration.html
- Glide 4.0.0 RC0 官方说明
https://github.com/bumptech/glide/releases/tag/v4.0.0-RC0