Android Glide4 异步图片框架
不了解官方推举使用Glide框架,可以先阅读Glide框架介绍.
Glide v4版本前几天新发布,一些新特性也需要学习下。
从V3到V4迁移,改变的行为和配置如下:
- Options
- RequestBuilder
- RequestOptions
- TransitionOptions
- Generated API
- Types and Targets
- Picking Resource Types
- Drawables
- Targets
- Cancellation
- Configuration
- Applications
- Libraries
- Manifest parsing
Options:
在Glide v3中,options是由一系列复杂的多个builder来处理。
在Glide v4中,处理options(centerCrop(),placeholder()等 )方式发生了改变。处理Options的方式将由单一类型的Builder和一系列提供Buidler的options对象所取代。 Glide`s generated API进一步简化,通过合并多个options和来源inegration libraries使用的Builder去创建单个流畅的API.
RequestBuilder:
API方法:
- listener()
- thumbnail()
- load()
- into()
在Glide v4中,从几种类型(Bitmap,Drawable,GifDrawable
等)中,选取一个来创建指定类型的RequestBuilder。RequstBuilder对象能控制自身的Options,包括Model(url,uri等等),thumbnail,lisRequestlistener。ReuqstBuilder的开启使用通过into()或者preload()
。
使用案例如下:
RequestBuilder<Drawable> requestBuilder = Glide.with(fragment)
.load(url);
requestBuilder
.thumbnail( Glide.with(fragment)
.load(thumbnailUrl) )
.listener(requestListener)
.load(url)
.into(imageView);
RequestOptions
API方法:
- centerCrop()
- placeholder()
- error()
- priority()
- diskCacheStrategy()
在v3中,大多数的options操作移到RequestOptions中。
一个包含一些列options的RequstOptions能够被多个RequstBuilder所运用。
使用案例如下:
RequestOptions myOptions = new RequestOptions()
.fitCenter()
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.override(100, 100);
Glide.with(fragment)
.load(url)
.apply(myOptions)
.into(drawableView);
Glide.with(fragment)
.asBitmap()
.apply(myOptions)
.load(url)
.into(bitmapView);
TransitionOptions
API方法:
- crossFade()
- animate()
TransitionOptions是用于控制占位图片或者thumbnails图片切换到真正需要加载的图片之间的过度。
TransitionOptions包含三个子类:
- GenericTransitionOptions
- DrawableTransitionOptions
- BitmapTransitionOptions
移除默认的transition,使用TransitionOptions.dontTransition()
使用案例:
Glide.with(fragment)
.load(url)
.transition(withCrossFade(R.anim.fade_in, 300));
Generated API
为了更好的使用Glide v4 , Glide为运用程序提供了一个generated API. 运用程序中应该创建一个带有@GlideModule注解的AppGlideModule子类,来使用generated API。更多闲情,阅读Generated API介绍.
Generated API添加一个GlideApp类,该类能够提供对RequestBuilder和RequestOptions子类的访问。RequestOptions子类包含RequestOptions包含的全部方法和GlideExtensions定义的方法。RequestBuilder子类不需要使用apply方法,来访问RequestBuilder子类中全部方法。
注意点:使用GlideApp,需要添加annotationProcessor 的依赖:来源
annotationProcessor 'com.github.bumptech.glide:compiler:4.0.0-RC0'
使用Generated AP,一个RequestOptions被内嵌调用:
GlideApp.with(fragment)
.load(url)
.centerCrop()
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.priority(Priority.HIGH)
.into(imageView);
不使用Generated API的方式案例:
Glide.with(fragment)
.load(url)
.apply(centerCropTransform()
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.priority(Priority.HIGH))
.into(imageView);
Types and Targets
Picking Resource Types
在使用Glide时,可以指定你想加载的资源类型。倘若你指定了一个超类的类型,Glide将尝试加载一个可用的子类类型。例如,指定加载类型是Drawable,Glide会加载BitmapDrawable或者GifDrawable。
Glide默认的请求是Drawable类型的:
Glide.with(fragment).load(url)
指定Bitmap类型:
Glide.with(fragment).asBitmap()
指定文件路径(最适合本地图片):
Glide.with(fragment).asFile()
去下载一个远程的文件写入缓存中,且获得一个文件路径:
Glide.with(fragment).downloadOnly()
//或者你已经有一个Url。
Glide.with(fragmetn).download(url);
Drawables
在Glide v3中GlideDrwable已经被移除,有利于anroid标准的Drawable。GlideBitmapDrawable也已经被移除,有利于BitmapDrawable。
判断一个Drawable是否是动画的,通过Animatable可以判断:
boolean isAnimated = drawable instanceof Animatable
Targets
onResourceReady()
的参数发生了改变
//原来的
onResourceReady(GlideDrawable drawable, GlideAnimation<? super GlideDrawable> anim)
//现在改成以下形式:
onResourceReady(Drawable drawable, Transition<? super Drawable> transition);
onLondFailed
的签名也改变了:
//原来的
onLoadFailed(Exception e, Drawable errorDrawable)
//现在的
onLoadFailed(Drawable errorDrawable)
使用RquestListener可以知道,在加载过程中失败的信息。
Cancellation
原本的Glide.with(Target)
移到RequestManager中,使用方式如下:
Glide.with(fragment).clear(target)
清除不是必须要求的,但是使用RequestManger开启加载,和清除加载,效果会更好。Glide v4跟踪每个Activity和Fragment的请求,因此需要适当的生命周期去清除这些请求。
Configuration
在Glide v3中,使用一个或者多个GlideModules来执行配置。在Glide v4中,配置工作是类似的,但稍微更复杂的系统配置。
更多新配置,请阅读Configuration页面。
Applications
在Glide v4中,转换和进入AppGlideModule:
@GlideModule
public class GiphyGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
builder.setMemoryCache(new LruResourceCache(10 * 1024 * 1024));
}
@Override
public void registerComponents(Context context, Registry registry) {
registry.append(Api.GifResult.class, InputStream.class, new GiphyModelLoader.Factory());
}
}
需注意:@GlideModule注解是必需的。
若是运用程序中具备多个GlideModules,将其中一个转成AppGlideModule,其他的转成LibraryGlideModules。倘若,存在AppGlideModule的时候,才会发现LibraryGlideModule。因此,不能仅适用LibraryGlideModules。
Libraries
拥有一个或者多个的GlideModule的库应该使用LibraryGlideModule而不是AppGlideModule。库不应是使用AppGlideModules,因为每个运用程序只有一个AppGliModules。因此,包含在唯一一个库的AppGlideModules,不会阻止库去设置库本身的options。多个库包含一个AppGlideMoudle,它会导致冲突。
在V4 中,Volley GlideModule的转换:
@GlideModule
public class VolleyLibraryGlideModule extends LibraryGlideModule {
@Override
public void registerComponents(Context context, Registry registry) {
registry.replace(GlideUrl.class, InputStream.class, new VolleyUrlLoader.Factory(context));
}
}
Manifest parsing
为了简化迁移,清单解析和旧的GlideModule接口已经被弃用,但是在V4中任然支持。AppGlideModules, LibraryGlideModules 和 弃用的 GlideModules已旧可以在程序中共存。
但是,为了避免检查元数据(和相关的错误)带来的性能开销。可以通过覆盖AppGlideModule中的isManifestParsingEnabled()
来,控制是否解析清单。
@GlideModule
public class GiphyGlideModule extends AppGlideModule {
@Override
public boolean isManifestParsingEnabled() {
return false;
}
...
}
资源参考:
Glide框架:http://blog.csdn.net/hexingen/article/details/72577453
Migrating from v3 to v4:http://bumptech.github.io/glide/doc/migrating.html