修改 网站 数据库,可以直接进入网站的正能量没封的,做ppt常用的网站有哪些,电视剧在线观看免费影视网站文章目录一、前言二、源码分析1、load()Android Glide图片加载框架系列文章
Android Glide图片加载框架#xff08;一#xff09;基本用法
Android Glide图片加载框架#xff08;二#xff09;源码解析之with()
Android Glide图片加载框架#xff08;二#xff09;源码…
文章目录一、前言二、源码分析1、load()Android Glide图片加载框架系列文章
Android Glide图片加载框架一基本用法
Android Glide图片加载框架二源码解析之with()
Android Glide图片加载框架二源码解析之load()
Android Glide图片加载框架二源码解析之into()
Android Glide图片加载框架三缓存机制 一、前言 在源码分析系列文章中上一篇我们分析了 Glide.with() 方法的用法及作用它传递了我们的上下文对象并且返回绑定了对应生命周期的RequestManager对象还没有看过上一篇文章的朋友建议先去阅读 Android Glide图片加载框架二源码解析之with()。 下面我们来详细分析 load() 方法的源码。 二、源码分析 1、load() 我们先来回顾下平时在使用load方法的时候可以传入很多不同的参数例如 Glide.with(this).load(R.drawable.ic_android).into(imageView);
Glide.with(this).load(http://xxx.xxx.png).into(imageView);
Glide.with(this).load(Uri.parse(xxxxx)).into(imageView);
Glide.with(this).load(getResources().getDrawable(R.drawable.ic_android)).into(imageView);
Glide.with(this).load(new File(xxx)).into(imageView);
Glide.with(this).load(BitmapFactory.decodeFile(xxx)).into(imageView);从上述代码中我们可以看到有很多个 load() 方法的重载支持了多种形式的图片资源包括 本地图片、应用资源、网络图片、二进制流、Uri对象 等使用起来很方便不用再自己写一堆请求网络或者读取本地文件的骚操作那么Glide的load()里面对它们做了什么处理能够兼容这么多形式的加载呢让我们一探究竟。
上一篇我们分析了 with() 方法的源码由于 with() 方法返回的是一个 RequestManager 对象那么很容易就能想到load() 方法是在 RequestManager 类当中的所以说我们首先要看的就是 RequestManager 这个类。
RequestManager 类的简化代码我们以load(String);为例如下所示
public class RequestManager implements LifecycleListener,ModelTypesRequestBuilderDrawable {...NonNullCheckResultOverridepublic RequestBuilderDrawable load(Nullable String string) {return asDrawable().load(string);}NonNullCheckResultpublic RequestBuilderDrawable asDrawable() {return as(Drawable.class);}NonNullCheckResultpublic ResourceType RequestBuilderResourceType as(NonNull ClassResourceType resourceClass) {return new RequestBuilder(glide, this, resourceClass, context);}...
}RequestManager 类的代码是非常多的但是经过我这样简化之后看上去就比较清爽了。在我们只探究加载图片URL字符串这一个load()方法的情况下那么比较重要的方法就只剩下上述代码中的这三个方法。
那么我们先来看 load() 方法这个方法中的逻辑是非常简单的只有一行代码就是先调用了 asDrawable() 方法而 asDrawable() 方法也极为简单就是调用了 as() 方法并且指定参数为 Drawable.class as()方法中初始化了一个 RequestBuilder 对象然后调用 RequestBuilder对象的load() 方法。
细心的朋友会发现Glide不止有 asDrawable() 其实还有 asBitmap() 、asGif() 、asFile() 等等如下 public class RequestManager implements LifecycleListener,ModelTypesRequestBuilderDrawable {...public RequestBuilderBitmap asBitmap() {return as(Bitmap.class).apply(DECODE_TYPE_BITMAP);}public RequestBuilderGifDrawable asGif() {return as(GifDrawable.class).apply(DECODE_TYPE_GIF);}public RequestBuilderFile asFile() {return as(File.class).apply(skipMemoryCacheOf(true));}public ResourceType RequestBuilderResourceType as(NonNull ClassResourceType resourceClass) {return new RequestBuilder(glide, this, resourceClass, context);}...
}由此我们可以发现Glide默认使用的是 asDrawable() 不管是还有 asBitmap() 、asGif() 还是 asFile() 最终都调用 as() 方法返回 RequestBuilder 对象实例。
RequestBuilder类的简化代码如下所示
public class RequestBuilderTranscodeType implements Cloneable,ModelTypesRequestBuilderTranscodeType {protected RequestBuilder(Glide glide, RequestManager requestManager,ClassTranscodeType transcodeClass, Context context) {this.glide glide;this.requestManager requestManager;this.transcodeClass transcodeClass;this.defaultRequestOptions requestManager.getDefaultRequestOptions();this.context context;this.transitionOptions requestManager.getDefaultTransitionOptions(transcodeClass);this.requestOptions defaultRequestOptions;this.glideContext glide.getGlideContext();}NonNullOverrideCheckResultpublic RequestBuilderTranscodeType load(Nullable String string) {return loadGeneric(string);}NonNullprivate RequestBuilderTranscodeType loadGeneric(Nullable Object model) {this.model model;isModelSet true;return this;}
}从 RequestBuilder 的构造方法中我们可以看到这里的 transcodeClass 就是我们刚传进来的Drawable类型成为了 RequestBuilder 的成员变量。RequestBuilder对象实例化后调用RequestBuilder的 load() 方法load()方法内部都是调用了 loadGeneric() 这里的 model 即传进来的资源参数例如String、Bitmap、File…同样赋给RequestBuilder的成员变量并且置 isModelSet 标志位为true即标志着设置完成的意思并且将这个RequestBuilder实例返回。
至此我们得到了关于 RequestBuilder参数 的一些信息 transcodeClass 表示要将最终结果转换为什么类型 model 表示传进来的资源参数 isModelSet 是为了标志你已经调用了load方法是一个必要条件否则你没有先设置你所要加载的资源Glide怎么知道你要加载啥。
至此Glide的 load() 完成了它的使命是不是有种被欺骗的感觉load()方法其实还没真正开始加载into()才是最终加载的地方 。