Glide的架构

Glide的架构

Posted by candy1126xx on May 14, 2017

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().