简介
Glide是Google推荐的一套快速高效的图片加载框架。
使用
链式调用。
//设置默认和出错时的图片
Glide.with(this).load(url).placeholder(resId).error(resId).into(mImageView)
//普通的图片加载
Glide.with(this).load(url).into(mImageView);
//可理解为加载动态图的第一帧的Bitmap,比如Gif
Glide.with(this).load(url).asBitmap().into(imageView);
//GIF加载,URL指向的资源必须是gif,如果是普通图片则不显示。
//相反,如果指向正确但没有执行asGif方法,则只是作为普通图片展示
Glide.with(this).asGif().load(url).into(mImageView);
//缩略图的加载
Glide.with(yourFragment).load(yourUrl).thumbnail(0.1f).into(yourView)
核心思想
1、对象池
Glide原理的核心是为bitmap维护一个对象池。对象池的主要目的是通过减少大对象内存的分配重用来提高性能
2、生命周期绑定
图片的加载任务会与activity或者Fragment的生命周期绑定,当界面执行onStop的使用自动暂停,而当执行onStart的时候又会自动重新开启,同样的,动态Gif图的加载也是如此,以用来节省电量。同时Glide会对网络状态做监听,当网络状态发生改变时,会重启失败的任务,以减少任务因网络连接问题而失败的概率。
3、预览图的使用
为加快加载速度,提高体验,优先加载预览图。
Glide的代码流程分析
1、RequestManager
Glide用来管理和开始请求的类,实现了LifecycleListener接口并重写了如下方法,可以使用Activity和Fragment的生命周期事件机制的开启、停止及重启请求任务。
/**
* 开始图片加载请求,一般在Activity或者Fragment的onStart方法内执行,用来重启失败或暂停的任务。
*/
@Override
public void onStart() {
resumeRequests();
}
/**
* 暂停图片加载请求,一般在Activity或Fragment的onStop方法内执行,用来暂停任务。
*/
@Override
public void onStop() {
pauseRequests();
}
/**
* 取消正在执行的请求,以及释放已完成请求的资源。
*/
@Override
public void onDestroy() {
requestTracker.clearRequests();
}
2、RequestManagerFragment
没有视图的Fragment,简单的来讲,就是在每一个Activity或者Fragment上又添加一个Fragment,该Fragment没有View,仅仅用来存储RequestManager并管理Glide请求。
3、RequestManagerRetriever
用来创建并从Activity或者Fragment检索已存在的RequestManager
4、Engine
负责开始加载任务,以及管理活跃的,已经饿得很的资源。
5、BitmapPool(bitmap对象的缓存池)
LruBitmapPool//基于LruPoolStrategy策略的BitmapPool
BitmapPoolAdapter//该实现类拒绝了对象的复用,get方法总是返回null
6、LruPoolStrategy
对象池内对象匹配策略,根据不同的标准,有如下三种匹配策略。
//校验bitmap内存大小和图片格式,内部的实现基于数组
1. SizeConfigStrategy
//仅要求bitmap尺寸完全匹配,内部的实现基于HashMap
2. AttributeStrategy
//校验bitmap尺寸和图片格式,内部实现基于TreeMap
3. SizeStrategy
7、RequestTracker
用来跟踪、取消和重启正在进行中、或者已完成、失败的请求。
8、ConnectivityMonitor
网络状态改变的监听,本质是一个BroadcastReceiver,值得一提的是,该类也是LifecycleListener的实现类,所以,也会有onStart、onStop的方法,而内部的逻辑,就是对网络状态监听的注册与反注册。
//注册网络状态改变的监听广播
private void register() {
if (isRegistered) {
return;
}
isConnected = isConnected(context);
context.registerReceiver(connectivityReceiver,
new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
isRegistered = true;
}
//取消注册
private void unregister() {
if (!isRegistered) {
return;
}
context.unregisterReceiver(connectivityReceiver);
isRegistered = false;
}
//是否有网络链接
private boolean isConnected(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected();
}
@Override
public void onStart() {
register();
}
@Override
public void onStop() {
unregister();
}
9、Resource
支持复用及池存储功能的特殊类型的接口,以下是其部分实现类
EngineResource //支持引用计数的Resource
BitmapResource //Bitmap的包装类
DrawableResource //抽象类,根据ConstantState返回一个依赖于自身ConstantState的drawable的副本
BitmapDrawableResource //BitmapDrawable的包装类
GifDrawableResource //GifDrawable的包装类
10、Target
LifecycleListener接口的子类,Glide用来加载资源并在加载时通知相关声明周期事件的接口。ViewTarget是它的抽象实现类。典型的生命周期是onLoadStarted->onResourceReady or onLoadFailed->onLoadCleared,然而并不保证一定按此顺序执行。比如:如果资源已经在内存中,则onLoadStarted就不会被调用,同样,如果Target永远不被清除,则onLoadCleared永远不会被调用。
//加载开始时调用
void onLoadStarted(@Nullable Drawable placeholder);
//加载失败是调用
void onLoadFailed(@Nullable Drawable errorDrawable);
//加载结束时调用
void onResourceReady(R resource, Transition<? super R> transition);
//加载任务取消并且资源被释放时调用
void onLoadCleared(@Nullable Drawable placeholder);
//取回目标大小,Callback的实现类为SizeDeterminer,在ViewTarget.class中
void getSize(SizeReadyCallback cb);
11、ViewTarget
加载资源的基类。Target的部分实现类。根据参数的类型,有不同的实现方法,并能通过ViewTreeObserver.OnDrawListener来决定View的大小。在需要检测任意涉及到复用View的ViewGroup时(比如listview),该类的setTag方法来存储一些标志,当检测到复用时,之前的加载任务和对应的资源文件会被取消或复用。
ImageViewTarget:在ImageView中展示图片的基类,有如下两个子类
DrawableImageViewTarget:当参数是drawable的使用使用
//核心方法
@Override
protected void setResource(Bitmap resource) {
view.setImageBitmap(resource);
}
BitmapImageViewTarget:当参数是bitmap 的时候使用
//核心方法
@Override
protected void setResource(Bitmap resource) {
view.setImageBitmap(resource);
}
12、LifecycleListener
Fragment和Activity生命周期方法的监听类,主要用来监听onStart,onStop,onDestroy三个方法。
13、DataFetcher
数据提取的抽象接口,根据资源的来源不同的实现,例如
HttpUrlFetcher //加载网络图片数据
AssetPathFetcher //加载Asset图片数据
LocalUriFetcher //加载本地图片数据
ThumbFetcher //加载MediaStore中的缩略图数据
14、DiskCacheStrategy
缓存策略的抽象类
ALL:远程数据同时缓存Data和Resource,本地数据仅缓存Resource
NONE:不缓存任何数据
DATA:解码之前直接将数据写入硬盘
RESOURCE:解码之后写入硬盘
AUTOMATIC:默认策略,根据DataFetcher以及ResourceEncoder的编码策略(EncodeStrategy)智能选择
参考:https://www.jianshu.com/p/7125feef0ddf