关于Glide v4的那些坑

什么是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:

  1. YourGlideModule extends AppGlideModule, you can override function applyOptions in the YourGlideModule class.
  2. You should make project in “android studio -> build -> make project”, it will generate the GlideApp class.
  3. 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

https://www.bbsmax.com/A/qVdeerpAdP/

Leave a Comment