Glide从V3到V4的探索

来源:互联网 发布:windows日志看不懂 编辑:程序博客网 时间:2024/06/05 12:58

关于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子类中全部方法

如:

@GlideModulepublic 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