什么是Glide
Glide是一个针对android处理图片缓存的三方类库. 可以对网络图片下载后进行缓存和一些基础操作. 同样的类库还有不少, 从目前(2020年)来说, 针对androidx, glide v4是最全面的一个扩展包, 同时也是google官方推荐的开源包.
Glide的使用
对于该library的使用, 我们在此给出各官方文档以及仓库的地址, 不赘述.
https://github.com/bumptech/glide
https://bumptech.github.io/glide/doc/configuration.html
V4 的一些改动
在此, 我们主要针对以下bug进行阐述和处理.
java.lang.RuntimeException: Expected instanceof GlideModule, but found:X.GlideModule@2e4554f
该问题调试信息具体如下:
java.lang.RuntimeException: Expected instanceof GlideModule, but found: com.eziagent.yiju.glide.GlideModule@2e4554f at com.bumptech.glide.module.ManifestParser.parseModule(ManifestParser.java:87) at com.bumptech.glide.module.ManifestParser.parse(ManifestParser.java:47)
毋庸置疑, 是Manifest文件解析出现了歧义. 解决方法是在工程里自己复写实现的AppGlideModule中添加:
@Override public boolean isManifestParsingEnabled() { return false; }
错误依旧存在. review开源库源码和使用文档后发现, v4版本不需要在manifest中重新声明Meta标记了. 而是直接overwrite GlideAppModule达到重新编译的效果.
Glide 4.0 need not have declare “GlideModule” in AndroidManifest.xml. You just need to following steps:
- YourGlideModule extends AppGlideModule, you can override function applyOptions in the YourGlideModule class.
- You should make project in “android studio -> build -> make project”, it will generate the GlideApp class.
- Use the GlideApp such as GlideApp.with(this).load(imgUrl).into(glide_test_iv1)
关于overwrite CustomGlideAppModule
1, 确定包含了glide:compiler的processor, 保证我们复写的Module得以重新编译.
implementation 'com.github.bumptech.glide:glide:4.11.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
2, 在glide的开源代码中找到HttpUrlFetcher并拷贝到当前工程. 其中更改GET与POST方法. 该类即是http访问方法类, 改写方法即可.
3, 同理, 在开源库中拷贝HttpUrlLoader接口, 更改其实现调用接口为HttpUrlPostLoader.
4, 找到并拷贝 extend AppGlideModule的方法接口. 通过override其下3个接口达到调用我们在上面定义的Loader和Fetcher, 代码如下:
@GlideModule public final class GlidePostModule extends AppGlideModule {@Override public void applyOptions(Context context, GlideBuilder builder)
{
super.applyOptions(context, builder);
}
@Override public void registerComponents(Context context, Glide glide, Registry registry) {
glide.getRegistry().replace(GlideUrl.class, InputStream.class, new HttpUrlPostLoader.Factory());
}
@Override public boolean isManifestParsingEnabled() {
return false;
}
}
REF links:
https://stackoverflow.com/questions/46638056/how-to-use-glidemodule-on-glide-4