• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Glide中request的调用和管理

Glide中request的调用和管理

作者:lxj1137800599的专栏 字体:[增加 减小] 来源:互联网 时间:2017-08-23

lxj1137800599的专栏通过本文主要向大家介绍了glide,glide加载图片,glide是什么意思,glide框架,android glide等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

WeakHashMap大致上就是,通过WeakReference和ReferenceQueue实现的。
WeakHashMap是通过数组table保存Entry(键值对),Entry继承WeakReference,最终继承Reference
WeakHashMap还有ReferenceQueue,是一个队列,它会保存被GC回收的“弱键”。
问题:如何自动删除Entry的?
里面有个函数expungeStaleEntries。就是从ReferenceQueue取出数据,然后找到在table中的位置,然后删除,也就是所谓的同步

 

Glide的into函数

    public <Y extends Target<TranscodeType>> Y into(@NonNull Y target) {
        Util.assertMainThread();
        Preconditions.checkNotNull(target);
        if (!isModelSet) {
            throw new IllegalArgumentException("You must call #load() before calling #into()");
        }

        Request previous = target.getRequest();

        if (previous != null) {
            requestManager.clear(target);
        }

        requestOptions.lock();
        Request request = buildRequest(target);
        target.setRequest(request);
        requestManager.track(target, request);///////

        return target;
    }

    void track(Target<?> target, Request request) {
        targetTracker.track(target);
        requestTracker.runRequest(request);//requestTracker里面有WeakHashMap,最后调用下面的begin函数
    }

public void begin() {
    ......
    status = Status.WAITING_FOR_SIZE;
    if (Util.isValidDimensions(overrideWidth, overrideHeight)) {
      onSizeReady(overrideWidth, overrideHeight);//////
    } else {
      target.getSize(this);
    }

    if ((status == Status.RUNNING || status == Status.WAITING_FOR_SIZE)
        && canNotifyStatusChanged()) {
      target.onLoadStarted(getPlaceholderDrawable());//一开始加载时显示的drawable
    }
    ......
}

public void onSizeReady(int width, int height) {
    ......
    status = Status.RUNNING;
    float sizeMultiplier = requestOptions.getSizeMultiplier();
    this.width = maybeApplySizeMultiplier(width, sizeMultiplier);
    this.height = maybeApplySizeMultiplier(height, sizeMultiplier);
    loadStatus = engine.load(
        glideContext,
        model,
        requestOptions.getSignature(),
        this.width,
        this.height,
        requestOptions.getResourceClass(),
        transcodeClass,
        priority,
        requestOptions.getDiskCacheStrategy(),
        requestOptions.getTransformations(),
        requestOptions.isTransformationRequired(),
        requestOptions.getOptions(),
        requestOptions.isMemoryCacheable(),
        requestOptions.getUseUnlimitedSourceGeneratorsPool(),
        requestOptions.getOnlyRetrieveFromCache(),
        this);
    ......
  }

  public <R> LoadStatus load(/****/) {
    //------------生成key
    EngineKey key = keyFactory.buildKey(model, signature, width, height, transformations,
        resourceClass, transcodeClass, options);

    //--------------从cache中获取(有数据就返回,没有就往下走)
    EngineResource<?> cached = loadFromCache(key, isMemoryCacheable);

    //--------------从activeResources中获取,这是一个Map<Key, WeakReference<EngineResource<?>>>(有数据就返回,没有就往下走)
    EngineResource<?> active = loadFromActiveResources(key, isMemoryCacheable);

    //-------------Map<Key, EngineJob<?>>,从构造函数中赋值(有数据就返回,没有就往下走)
    EngineJob<?> current = jobs.get(key);

    //------生成EngineJob和DecodeJob
    EngineJob<R> engineJob = engineJobFactory.build(key, isMemoryCacheable,
        useUnlimitedSourceExecutorPool);
    DecodeJob<R> decodeJob = decodeJobFactory.build(/***/);

    jobs.put(key, engineJob);//-----缓存变量

    engineJob.addCallback(cb);//---添加回调接口
    engineJob.start(decodeJob);//-----开始执行decode
    //-----EngineJob只是调度,并不执行decode,它做的事只是添加回调接口以及决定让哪个executer来执行runnable

    return new LoadStatus(cb, engineJob);
  }

DecodeJob继承自Runnable,那就看run方法。run里面调用runWrapped

private void runWrapped() {
     switch (runReason) {
      case INITIALIZE:
        stage = getNextStage(Stage.INITIALIZE);
        currentGenerator = getNextGenerator();
        runGenerators();
        break;
      case SWITCH_TO_SOURCE_SERVICE:
        runGenerators();
        break;
      case DECODE_DATA:
        decodeFromRetrievedData();
        break;
      default:
        throw new IllegalStateException("Unrecognized run reason: " + runReason);
    }
  }

runWrapped会调整里面的decode方式之类的,最终调用decodeFromRetrievedData,然后调用decodeFromData,decodeFromFetcher……最后

@Override
  public Resource<BitmapDrawable> decode(DataType source, int width, int height, Options options)
      throws IOException {
    Resource<Bitmap> bitmapResource = decoder.decode(source, width, height, options);
    if (bitmapResource == null) {
      return null;
    }

    return LazyBitmapDrawableResource.obtain(resources, bitmapPool, bitmapResource.get());
  }

decode那句,找到实现方法ByteBufferBitmapDecoder.decode。一直搜索下去,会看到熟悉的
BitmapFactory.decodeStream(is, null, options);
就是最终的实现(一直要往里面搜索好几层呢)

总结:管理靠的是WeakHashMap,调用看的是EngineJob,执行看的是DecodeJob

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Glide中request的调用和管理
  • Glide生命周期管理
  • 【RecyclerView与Glide】实现一个Android电子书阅读APP,gliderecyclerview
  • Glide的常用方法注释,Glide常用方法注释
  • Glide,glideandroid
  • android 图片加载库 Glide 的使用介绍,

相关文章

  • 2017-05-26Android 手机卫士--导航界面4的业务逻辑,android卫士
  • 2017-05-26android 水准仪的实现(方向传感器的使用)
  • 2017-05-26android源码解析之(四)--)IntentService
  • 2017-05-26安卓开发 第一篇 关于依赖注入框架dagger2的使用和理解
  • 2017-05-26Android 5.0(包含5.0以下版本) 获取栈顶应用程序包名,android包名
  • 2017-05-26统计Git版本库每个人提交次数和代码的增加和删除行数脚本
  • 2017-05-26Apk去掉签名以及重新签名的方法,apk去掉签名
  • 2017-05-26GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级,greendaoraw
  • 2017-05-222.2.3 TableLayout(表格布局)
  • 2017-05-224.1.1 Activity初学乍练

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 5个Android开发中比较常见的内存泄漏问题及解决办法,android比较常见
    • 安卓开发与分析者的利器--安卓右键工具
    • ORB_SLAM2在Android上的移植过程
    • 百度地图开发的学习(一),百度地图开发学习
    • 安卓四大组件之服务,安卓四大组件
    • Android几种Tab的实现方法
    • Android菜单(动画菜单、360波纹菜单),android波纹
    • android:Activity数据传递之对象(parcelable)
    • 在Android studio中进行单元测试和ui测试的分析
    • Android热补丁动态修复技术(三)—— 使用Javassist注入字节码,完成热补丁框架雏形(可使用)

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有