glide替换okhttp以及更改连接超时时间(TIME_OUT)

Glide替换okhttp,更改超时时间,看似简单,具体写的过程中坑还是真多,特记录一下,也帮助需要的人。本文基于Glide 4.x。

首先,替换okhttp,官方给了一个及其简单的方式。

implementation "com.github.bumptech.glide:okhttp3-integration:4.6.1"

这个地方是有一个坑的。我实际做的时候,发现加上这一句以后,图片死活加载不出来了 。以为替换的方式有问题,查了大量资料和源码都没有结果。后来分析log发现log上写连接失败。我换了几张网络图片都不行,而用普通的连接方式是可以加载出图片的。于是想到了是wifi代理证书问题。换了个wifi果然好了。。

OK,okhttp替换是很简单(如果你的wifi没有问题的话。。),下面来看定制TIME_OUT。去他引用的这个integration工程里的OkHttpUrlLoader里看,有internalClient这个OkHttpClinet,依旧是写死的,不能定制其超时时间。OkHttpUrlLoader的Factory有两个构造函数,自然就想到了能不能调用第二个构造函数,传进一个定制了超时时间的OkHttpClient去。但是查看这个Factory的调用树,发现它是被OkHttpGlideModule(已经过时)和OkHttpLibraryGlideModule这两个类调用的,这两个类都是组件类,在Glide初始化的时候会执行registerComponents替换掉原来的GlideUrl。区别是一个是老的形式,必须在manifest里定义meta-data,另一个是新的形式,用注解的方式替代manifest定义。

OkHttpGlideModule(已经过时)和OkHttpLibraryGlideModule这两个类同时都生成了,应该是为了向下兼容。然后我试着把断点加到这两个类的registerComponents方法中,发现只有OkHttpGlideModule这个类的方法执行了,而新的OkHttpLibraryGlideModule的方法并没有执行。为什么呢?于是只好debug Glide的源码。在Glide的initializeGlide方法中,有如下两段代码:

List manifestModules = Collections.emptyList();
    if (annotationGeneratedModule == null || annotationGeneratedModule.isManifestParsingEnabled()) {
      manifestModules = new ManifestParser(applicationContext).parse();
    }
Set> excludedModuleClasses =
          annotationGeneratedModule.getExcludedModuleClasses();

可以看到,分别去menifest里和注解里去找相应的GlideMode。其中getAnnotationGeneratedGlideModules是具体找注解类的过程。理论上先执行了manifest查找替换,然后再执行的Annotation查找替换,应该能执行OkHttpLibraryGlideModule里的代码并且最后以它为准才对(因为他是后执行的,replace操作当然以后执行的为准)。但是为啥它没有被执行到呢?

这个问题费了挺长时间,我自己定义了一个类似OkHttpLibraryGlideModule的注解GlideMode,也同样执行不到。后来debug,发现出了异常GeneratedAppGlideModuleImpl找不到,不过异常的注释终于给了我答案。。

"Failed to find GeneratedAppGlideModule. You should include an annotationProcessor compile dependency on com.github.bumptech.glide:compiler in your application and a @GlideModule annotated AppGlideModule implementation or LibraryGlideModules will be silently ignored"

最后一句,如果是implementation LibraryGlideModules则默默的忽略掉。。。坑啊,自动生成的OkHttpLibraryGlideModule是继承的LibraryGlideModule,然后告诉我说如果继承它则忽略掉。。好吧,我把我自己创建的MyOkHttpGlideModule继承自AppGlideModule,然后client传定制了timeOut的OkHttpClient,debug就一切正常了。

最后,MyOkHttpGlideModule源码如下:

public final class MyOkHttpGlideModule extends AppGlideModule {
    OkHttpClient client=new OkHttpClient.Builder()
            .connectTimeout(10000, TimeUnit.SECONDS)
            .readTimeout(10000, TimeUnit.SECONDS)
            .writeTimeout(10000, TimeUnit.SECONDS)
            .build();
    @Override
    public void registerComponents(Context context, Glide glide ,Registry registry) {
        OkHttpUrlLoader.Factory factory = new OkHttpUrlLoader.Factory(client);
        registry.replace(GlideUrl.class, InputStream.class,factory);
    }
}

你可能感兴趣的:(glide替换okhttp以及更改连接超时时间(TIME_OUT))