GlideBuilder

Posted bdmh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GlideBuilder相关的知识,希望对你有一定的参考价值。

从名字看,大家应该不会感到陌生,这是android中经常会遇到的Builder模式,它为Glide提供了默认的配置。

《初始化:Glide.java》中提到了Glide实例创建的代码。

private static void initializeGlide(
    @NonNull Context context, @Nullable GeneratedAppGlideModule generatedAppGlideModule) 
    initializeGlide(context, new GlideBuilder(), generatedAppGlideModule);


private static void initializeGlide(
        @NonNull Context context,
        @NonNull GlideBuilder builder,
        @Nullable GeneratedAppGlideModule annotationGeneratedModule)
    ......
//获取Application级别的Context
    Context applicationContext = context.getApplicationContext();
//Build模式创建Glide实例
    Glide glide = builder.build(applicationContext);
    ......
//赋值给单例对象
    Glide.glide = glide;

在initializeGlide方法中,会对builder进行初始设置以及运行用户进行干预。

RequestManagerRetriever.RequestManagerFactory factory =
        annotationGeneratedModule != null
                ? annotationGeneratedModule.getRequestManagerFactory()
                : null;
builder.setRequestManagerFactory(factory);
for (com.bumptech.glide.module.GlideModule module : manifestModules) 
    module.applyOptions(applicationContext, builder);

if (annotationGeneratedModule != null) 
    annotationGeneratedModule.applyOptions(applicationContext, builder);

annotationGeneratedModule 是可以通过注解方式,自动创建的,用户可以通过自定义的Module来设置一些选项或者注册自己的组件,比如使用自己的网络组件,这个后面会讲。

这个module也可以在Manifest文件中定义,所以会遍历manifest中定义的module

for (com.bumptech.glide.module.GlideModule module : manifestModules) 
    module.applyOptions(applicationContext, builder);

这些过程完成后,就会调用Builder的build方法创建Glide实例了。

Builder中包含以下可设置的属性。

//保存过场的map
private final Map<Class<?>, TransitionOptions<?, ?>> defaultTransitionOptions = new ArrayMap();
//实验性接口,记录轨迹,暂不用理会
private final GlideExperiments.Builder glideExperimentsBuilder = new GlideExperiments.Builder();
//用来加载和管理活动和缓存中资源的
private Engine engine;
//bitmap池子,用来复用图像的
private BitmapPool bitmapPool;
//数组池子,管理各种数组对象
private ArrayPool arrayPool;
//MemoryCache接口,管理缓存中资源的
private MemoryCache memoryCache;
//Glide执行任务的,处理不在缓存中的资源
private GlideExecutor sourceExecutor;
//Glide执行任务的,处理缓存中的资源
private GlideExecutor diskCacheExecutor;
//依然是处理缓存的,懒加载,具体由子类执行
private DiskCache.Factory diskCacheFactory;
//根据设备屏幕密度,width,height等信息,计算缓存大小
private MemorySizeCalculator memorySizeCalculator;
//监测网络连接
private ConnectivityMonitorFactory connectivityMonitorFactory;
//日志级别,默认Log.INFO
private int logLevel = 4;
//创建RequestManager,管理Glide的请求
private RequestManagerRetriever.RequestManagerFactory requestManagerFactory;
//Glide执行任务的,加载动画图像用
private GlideExecutor animationExecutor;

/**
 * 是否保留活动的资源
 * 默认:false
 * true:加载的资源将不会被回收,即强引用
 * false:弱引用
  */
private boolean isActiveResourceRetentionAllowed;
//图像加载监听的集合
private List<RequestListener<Object>> defaultRequestListeners;

Builder的工作就是对上面这些属性进行设置,并传递给Glide实例。

默认在创建Glide时,会初始化每一个对象。

Glide build(@NonNull Context context) 
    if (sourceExecutor == null) 
        sourceExecutor = GlideExecutor.newSourceExecutor();
    

    if (diskCacheExecutor == null) 
        diskCacheExecutor = GlideExecutor.newDiskCacheExecutor();
    

    if (animationExecutor == null) 
        animationExecutor = GlideExecutor.newAnimationExecutor();
    

    if (memorySizeCalculator == null) 
        memorySizeCalculator = new MemorySizeCalculator.Builder(context).build();
    

    if (connectivityMonitorFactory == null) 
        connectivityMonitorFactory = new DefaultConnectivityMonitorFactory();
    
    ......

Builder中的这些设置,我们都可以通过自定义的AppGlideModule子类的applyOptions方法进行设置。

以上是关于GlideBuilder的主要内容,如果未能解决你的问题,请参考以下文章

Glide:GlideBuilder

单列(写了池子pool)用list实现的方法, 与伪单例(写了池子zidianpool),用字典实现的方法,可以存入不同,i名字的物体

5分钟学会撤池子 薄饼pancakeswap教程 撤销流通池图文课程

F5 GTM DNS 知识点和实验 6 -智能DNS算法

华为3面,官网显示面试通过了...开始泡池子,进入漫长等待期

php-fpm的pool池子php慢日志记录open_basedirphp-fpm进程管理