最新消息:欢迎访问Android开发中文站!商务联系QQ:1304524325

Glide深入学习

开发进阶 loading 263浏览 0评论

注:本篇文章仅供自己学习记录使用,帮助自身记忆为主,不供他人参照学习,如想深入理解Glide,请移步至郭霖Glide系列文章

Glide.with(this).load("").into(xxx);

with:获取requestManager。

分为application和非application,前者返回绑定了application的requestManager,后者在当前activity中添加隐藏的fragment(glide拿不到activity生命周期,故从fragment入手,他俩周期是同步的,activity销毁掉后,fragment即可监听到,这样glide可以捕获到可以停止加载图片了)

load:返回DrawableTypeRequest。

return (DrawableTypeRequest) fromString().load(string);
fromString中loadGeneric,new一个DrawableTypeRequest,并传参数过去,这样得到DrawableTypeRequest后调用load方法,load方法在父类GenericRequestBuilder中,此类含有大量glide的api,建造者模式构建api。(DrawableTypeRequest是GenericRequestBuilder子类)

into:进行网络请求并转码

into(glide.buildImageViewTarget(view, transcodeClass));
括号中是获取到目标target view大概分为静态图和动态图两种,然后进入into方法,
into方法中先进行变换不用看,获取request对象run然后begin,
调用onSizeReady方法中的load,其中进入EngineRunnable线程查看decode(),分为decodeFromCache和decodeFromSource,缓存不看,进入DecodeJob的decodeFromSource(),
fetcher.loadData()中调用了HttpUrlFetcher中网络请求,返回的是InputStream,最终回到Decodejob中decodeFromSourceData再转码返回Resource,EngineRunnable执行onLoadComplete->onResourceReady,静态图则调用ImageViewTarget中的onResourceReady方法进行setResource(BitmapImageViewTarget中setResource)

缓存机制:

流程:首先从内存缓存读取,如果没有,则执行EngineRunnable中run方法的decode,分为decodeFromCache()和decodeFromSource(),decodeFromCache分为进行磁盘缓存读取(result),磁盘原始缓存图片(source),如不走磁盘缓存,则decodeFromSource就是从网络读取图片,然后decodeFromSourceData写入原始磁盘缓存,结束之后transformEncodeAndTranscode(decoded)缓存转码后的图片,最后图片加载完成之后回调onLoadComplete,执行内存缓存的写入。
key生成条件比较多,id、width、height等都有影响.

内存缓存:

读:获取网络图片之前会先从内存中获取loadFromCache(LruCache),如果为空则继续往下走loadFromActiveResources(弱引用),否则直接onResourceReady(两种内存缓存搭配使用防止Lruche中的使用中图片被回收)
写:(弱引用)图片加载完成后,onLoadComplete,发送handler为MSG_COMPLETE的消息表示加载完成,然后handleResultOnMainThread执行,onEngineJobComplete中执行 activeResources.put方法

(LruCache)engineResource.acquire()次数+1,release-1,当acquired变量大于0的时候,说明图片正在使用中,也就应该放到activeResources弱引用缓存当中。而经过release()之后,如果acquired变量等于0了,说明图片已经不再被使用了,那么此时会调用listener的onResourceReleased()方法来释放资源
activeResources.remove(cacheKey) 从弱引用中移除,然后
cache.put(cacheKey,
resource)添加到LruCache中,这样也就实现了正在使用中的图片使用弱引用来进行缓存,不在使用中的图片使用LruCache来进行缓存的功能。

变换:
https://github.com/wasabeef/glide-transformations

自定义:
1.配置(在AndroidManifest中meta配置,创建glide之前会配置初始化信息)

    public class MyGlideModule implements GlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        builder.setDiskCache(new ExternalCacheDiskCacheFactory(context));
        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
    }
    @Override
    public void registerComponents(Context context, Glide glide) {
    }
}

2.组件
okhttp:HttpUrlFetcher仿照替换为OkHttpFetcher

 public class MyGlideModule implements GlideModule {
    ...
    @Override
    public void registerComponents(Context context, Glide glide) {
        glide.register(GlideUrl.class, InputStream.class, new OkHttpGlideUrlLoader.Factory());
    }
}

3.进度条

public class MyGlideModule implements GlideModule { 
    @Override 
    public void applyOptions(Context context, GlideBuilder builder) { 
    } 

    @Override 
    public void registerComponents(Context context, Glide glide) { 
        OkHttpClient.Builder builder = new OkHttpClient.Builder(); 
        builder.addInterceptor(new ProgressInterceptor()); 
        OkHttpClient okHttpClient = builder.build(); 
        glide.register(GlideUrl.class, InputStream.class, new OkHttpGlideUrlLoader.Factory(okHttpClient));
    } 
}

转载请注明:Android开发中文站 » Glide深入学习

您必须 登录 才能发表评论!