• Glide深入学习

    发布:51Code 时间: 2018-06-04 13:50

  • 本篇文章仅供自己学习记录使用,帮助自身记忆为主。 Glide.with(this).load().into(xxx); with:获取requestManager。 分为application和非application,前者返回绑定了application的requestManager,后者在当前...

  • 本篇文章仅供自己学习记录使用,帮助自身记忆为主。

    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));

        } 

    }

    文章来源:网络
    上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编caoxiaoyan@51testing.com,我们将立即处理
  • 上一篇:最新整理的Android与其他优秀开源库分享

    下一篇:Android 全局Dialog的简单实现

网站导航
Copyright(C)51Code软件开发网 2003-2018 , 沪ICP备05003035号