Glide从V3到V4的探索

关于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

Applications

  • 若是运用程序中具备多个GlideModules,将其中一个转成AppGlideModule,其他的转成LibraryGlideModules。倘若,存在AppGlideModule的时候,才会发现LibraryGlideModule。因此,不能仅适用LibraryGlideModules

Libraries

  • 拥有一个或者多个的GlideModule的库应该使用LibraryGlideModule而不是AppGlideModule。库不应是使用AppGlideModules,因为每个运用程序只有一个AppGliModules。因此,包含在唯一一个库的AppGlideModules,不会阻止库去设置库本身的options。多个库包含一个AppGlideMoudle,它会导致冲突。

好了,到这里就结束了,如果想了解更多,可以参考github上的官方文档

资源参考:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值