Glide

简介

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值