移动架构37_Glide架构简述

一、原理架构

与普通的图片加载架构大致相同,具体的步骤,Glide实现更复杂,功能更强大全面,这里只对它的框架做简单介绍
正常图片加载框架类图:

这里写图片描述

普通的图片加载框架:移动架构36_图片加载框架

二、注意点:

在Fragment或Activity中,加载图片,Glide能够自动实现取消、暂停、恢复,如何实现的呢?
Glide.with 将当前显示的页面对象传入Glide
SupportRequestManagerFragment 空的fragment 监听当前页面的生命周期
ActivityFragmentLifecycle 观察者模式,fragment的生命周期交给了他

Glide生命周期
这里写图片描述

三、源码分析:版本:glide-3.6.1

时序图:
这里写图片描述

(1)Glide.with

将当前显示的页面对象传入Glide
SupportRequestManagerFragment 空的fragment 监听当前页面的生命周期
ActivityFragmentLifecycle 观察者模式,fragment的生命周期交给了他

(2)into

1)DrawableRequestBuilder:

@Override
public Target into(ImageView view) {
return super.into(view);
}

=>GenericRequestBuilder
->into(glide.buildImageViewTarget(view, transcodeClass))

Request previous = target.getRequest();
if(previous != null) {
//判断当前的ImageView是否存在了请求
//如果存在 将请求取消,并且回收资源
previous.clear();
this.requestTracker.removeRequest(previous);
previous.recycle();
}
//创建请求 request是一个接口,请求的实现类:GenericRequest
Request request = this.buildRequest(target);
//开始执行请求
this.requestTracker.runRequest(request);

=》RequestTracker:runRequest
request.begin();//请求开始

=》GenericRequest
begin()
:onSizeReady(overrideWidth, overrideHeight);

onSizeReady()
//DataFetcher相当于加载图片的一个Loader接口(包括网络、File类型的 )
final DataFetcher dataFetcher = modelLoader.getResourceFetcher(model, width, height);
//DataFetcher接口中有一个loadData方法,用来加载图片
//返回的子类型 是根据第一个参数 model 来确定

this.loadStatus = this.engine.load(this.signature, width, height, dataFetcher, this.loadProvider, this.transformation, transcoder, this.priority, this.isMemoryCacheable, this.diskCacheStrategy, this);
把请求丢给图像处理引擎处理图片

2) engine.load://判断内存是否缓存了这张图片

EngineResource cached = this.loadFromCache(key, isMemoryCacheable);

//EngineJob负责加载每一个请求,它里面有线程池成员变量
EngineJob engineJob = engineJobFactory.build(key, isMemoryCacheable);

EngineRunnable runnable = new EngineRunnable(engineJob, decodeJob, priority);
//EngineRunnable 实现Runable接口,具体执行请求逻辑 run(),功能:请求资源,处理资源,缓存资源

engineJob.start(runnable);
EngineJob.start():
//EngineJob有一个专门处理线程的类:ExecutorService
=》EngineRunnable的run方法:
解析图片,返回glide里面的resource对象
resource = this.decode();
=》decodeFromSource()
decodeJob.decodeFromSource();

3)decodeJob:专门解析图片

public Resource decodeFromSource() throws Exception {
Resource decoded = decodeSource();
return transformEncodeAndTranscode(decoded);
}

decodeSource():
Object data = this.fetcher.loadData(this.priority);
通过加载器 实现图片加载 他是运行子线程 run方法被调用
加载网络图片时 data是inputStream类型

DataFetcher的实现类: HttpUrlFetcher
loadData =》loadDataWithRedirects:

urlConnection.setConnectTimeout(2500);
urlConnection.setReadTimeout(2500);

解析Urlconnectiong返回的InputStream流对象

4)回到DecodeJob的decodeSource方法中去:

=》decodeFromSourceData(data)

decoded = loadProvider.getSourceDecoder().decode(data, width, height);
//getSourceDecoder返回的是StreamBitmapDecoder

StreamBitmapDecoder:decode
public Resource decode(InputStream source, int width, int height) {
Bitmap bitmap = downsampler.decode(source, bitmapPool, width, height, decodeFormat);
return BitmapResource.obtain(bitmap, bitmapPool);
}
将Bitmap封装成Resource返回

总结,Glide的图片加载流程如下:
这里写图片描述

相关文章
相关标签/搜索
每日一句
    每一个你不满意的现在,都有一个你没有努力的曾经。
公众号推荐
   一个历史类的公众号,欢迎关注
一两拨千金