Glide的架构大体可分为4个部分:资源封装、构造请求、管理请求、执行请求。以下只列出默认实现中用到的类。
资源封装
Glide对用到的Android资源类都进行了一层封装。
// 对Drawable封装的基类。如果要显示到View上,必须转换成其子类。
abstract class GlideDrawable
// 针对Bitmap的GlideDrawable。
class GlideBitmapDrawable extends GlideDrawable
// 针对Gif的GlideDrawable。
class GifDrawable extends GlideDrawable
// 对资源对象的封装。为它们添加“返回占用内存大小”、“释放资源”的方法。且高度抽象,方便处理。
interface Resource<Z>
// 文件资源
class SimpleResource<T> implements Resource<T>
class FileResource extends SimpleResource<File>
// Bitmap资源
class BitmapResource implements Resource<Bitmap>
// 字节数组
class BytesResource implements Resource<byte[]>
// 封装了GifDrawable、Bitmap,意即哪个有值用哪个
public class GifBitmapWrapper {
private final Resource<GifDrawable> gifResource;
private final Resource<Bitmap> bitmapResource;
}
class GifBitmapWrapperResource implements Resource<GifBitmapWrapper>
// 对BitmapDrawable、GifDrawable、GlideBitmapDrawable的封装
abstract class DrawableResource<T extends Drawable> implements Resource<T>
class BitmapDrawableResource extends DrawableResource<BitmapDrawable>
class GlideBitmapDrawableResource extends DrawableResource<GlideBitmapDrawable>
class GifDrawableResource extends DrawableResource<GifDrawable>
// 从缓存中获得的资源
class EngineResource<Z> implements Resource<Z>
构造请求
Glide的请求描述了从输入参数到最终显示到View上的全部过程。可细分为3个过程。
MoudleType -> DataType -> ResourceType -> TranscodeType
MoudleType的取值有:File(文件)、int(资源ID)、Integer(资源ID)、String(本地路径、网络路径)、Uri、URL、GlideUrl、byte[]。
DataType的取值有:InputStream、PacelFileDescriptor、ImageVideoWrapper(封装了InputStream、PacelFileDescriptor,意即哪个有值用哪个)。
ResourceType的取值有:Bitmap、GifBitmapWrapper、GifDrawable
TranscodeType的取值有:byte[]、GlideDrawable、GlideBitmapDrawable
管理请求
RequestManager
至少有1个与Application相对应的RequestManager,且为单例。
如果调用Glide.with()传入的为Activity/Fragment,都会再创建一个与参数生命周期相同的RequestManager。生命周期的绑定由“添加空Fragment”实现。
当Fragment.onStart()/Activity.onStart()时,当Fragment.onStop()/Activity.onStop()时,当Fragment.onDestroy()/Activity.onDetroy()时,会分别调用RequestTrack的相应方法。
RequestTrack
缓存绑定组件发出的所有请求以控制它们开始、暂停、取消。
runRequest() // 开始执行一个请求
resumeRequests() // 重启所有未完成请求。当onStart()时调用。
pauseRequests() // 停止所有正在进行的请求。当onStop()时调用。
clearRequests() // 取消所有请求并释放所有资源。当onDestroy()时调用。
执行请求
//
class Engine {
EngineKeyFactory keyFactory; // 创建的Key用于缓存EngineJob和activeResource
Map<Key, EngineJob> jobs; // 缓存正在执行的EngineJob
Map<Key, WeakReference<EngineResource<?>>>; // 缓存activeResource
ResourceRecycler resourceRecycler; // 向主线程发送消息,执行Resource.recycle()
MemoryCache cache; // 内存缓存
LazyDiskCacheProvider diskCacheProvider; // 磁盘缓存
}
// EngineJob 当一次请求完成时,回调给Engine
// DecodeJob “3个过程”的真正执行者
// EngineRunnable 对EngineJob和DecodeJob的封装
GenericRequest.begin() -> Engine.load() -> 没有可用缓存 -> EngineJob.start() -> EngineRunnable.run() -> DecodeJob执行 -> EngineJob向主线程回调 -> Engine.onEngineJobComplete() -> GenericRequest.onResourceReady() -> Taregt.onResourceReady().