移动架构37_Glide架构简述

来源:互联网 发布:php开发分类信息 编辑:程序博客网 时间:2024/05/29 12:58

一、原理架构

与普通的图片加载架构大致相同,具体的步骤,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的图片加载流程如下:
这里写图片描述

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 多少岁可以开淘宝店 学开淘宝店 淘宝运营怎么做 现在开淘宝店 淘宝多开 新手开淘宝 网店需要投资多少钱 如何在网上开店做淘宝 知心淘购 淘天购 如何开港股 如何开港股账户 港股账户怎么开 港股开户哪家好 开通港股 开通港股的条件 怎么开通港股账户 大陆人开港股账户条件 炒港股如何开户 青岛市开源集团供热查询电话 开滦集团还能撑多久 唐山开滦集团 开滦吧 火锅店潮名字大全 当火车开入这座陌生的城市 火车开了还能改签吗 火车开了儿歌 梦见火车从身边开过 火车开了 火车快开 火车怎么开 火车是怎么开的 火车就要开 动车开通 动车什么时候开通的 魔兽世界视灵药剂 橡胶开炼机 二手开炼机 开炼机价格 二手炼胶机 小型开炼机