移动架构37

xiaoxiao2021-02-28  33

一、原理架构

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

转载请注明原文地址: https://www.6miu.com/read-250013.html

最新回复(0)