转载请标明地址 QuincySx: http://www.jianshu.com/p/e8adc9581f69
问题不定时更新,如果你也有问题欢迎在评论区提出
Glide 是如何拓展不同的资源获取器的
- 在 manifest 文件中 添加 meta-data 标签、key 为 GlideModule 的路径,value 为 "GlideModule"
- 在 RequestManager 的构造方法里 调用了 Glide.get(context) 方法,通过 ManifestParser 根据 meta-data 标签的 value 来获取所有 manifest 中配置的 GlideModule ,然后循环调用GlideModule.registerComponents() 方法,将 ModelLoader 通过 Glide.register() 方法注册到 GenericLoaderFactory 中
当添加几个相同类型的资源获取器时,Glide的选择策略是什么
在 Glide 中维护这一个 GenericLoaderFactory 对象,在 Glide.register() 调用 GenericLoaderFactory.register() 的方法中可以看到他是根据相应资源的 class(此处关于 ModelLoader 的加载可以查看 Glide 的构造方法) 来替换相应的 ModelLoader,也就是 Glide 的策略是如果一个后配置者会替代前者
发现 Glide 中使用网络图片时是调用的 load(String url) 这个方法、那么为什么源码中网络请求 DataFetcher 的类型 GlideUrl.class 他是怎么转换的
- 你传入的 String 会在 StreamStringLoader 类的父类中的 StringLoader.getResourceFetcher() 中将 String 转换为 Uri 并调用 StreamUriLoader.getResourceFetcher()
- 在 StreamUriLoader.getResourceFetcher() 判断是否是本地资源,如果是本地资源就加载,如果不是本地资源 那就去调用 HttpUrlGlideUrlLoader.getResourceFetcher()(默认的,如果配置过就是其他的 这也就是 GlideUrl.class 类型的加载器)进行网络加载
- 在 HttpUrlGlideUrlLoader.getResourceFetcher() 方法中,先判断缓存,然后 new 出 HttpUrlFetcher 返回,在进行网络请求
注释:这几个转换在 Glide 构造里 这些加载类都是用的 Factory 来加载的,在 Factory() 中他默认传递过,类似责任链模式