UIl与Volley一样是非常古老的框架,UIL实现了从网络获取图片,对图片进行缓存,以及根据个性化的设置来将图片加载到ImageView上。

这篇文章 主要分析UIl在初始化配置的源码

UIL初始化的源码分析

UIl提供在Application中进行UIl的初始化操作,常见的初始化操作代码如下:


ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context);
config.threadPriority(Thread.NORM_PRIORITY - 2);
config.denyCacheImageMultipleSizesInMemory();
config.diskCacheFileNameGenerator(new Md5FileNameGenerator());
config.diskCacheSize(50 * 1024 * 1024); // 50 MiB
config.tasksProcessingOrder(QueueProcessingType.LIFO);
config.writeDebugLogs(); // Remove for release app // Initialize ImageLoader with configuration.
ImageLoader.getInstance().init(config.build());

以Builder模式来构建ImageLoaderConfiguration。

下面是ImageLoaderConfiguration类的成员变量,也是具体的配置选项。


//资源信息
final Resources resources;
//内存缓存 图片的最大宽度
final int maxImageWidthForMemoryCache;
//内存缓存 图片的最大高度
final int maxImageHeightForMemoryCache;
//本地文件系统缓存 图片的最大宽度
final int maxImageWidthForDiskCache;
//本地文件系统缓存 图片的最大高度
final int maxImageHeightForDiskCache;
//本地文件系统缓存 图片处理器
final BitmapProcessor processorForDiskCache;
//任务执行者
final Executor taskExecutor;
//图片缓存任务执行者
final Executor taskExecutorForCachedImages;
//是否自定义任务执行者
final boolean customExecutor;
//是否为图片缓存自定义任务执行者
final boolean customExecutorForCachedImages;
//线程池中线程数量
final int threadPoolSize;
//线程等级
final int threadPriority;
//队列中处理算法类型
final QueueProcessingType tasksProcessingType;
//内存缓存对象
final MemoryCache memoryCache;
//本地文件系统缓存对象
final DiskCache diskCache;
//图片默认下载加载器
final ImageDownloader downloader;
//图片解码器
final ImageDecoder decoder;
//图片显示配置参数
final DisplayImageOptions defaultDisplayImageOptions;
//网络拒绝时下载器
final ImageDownloader networkDeniedDownloader;
//慢网络时下载器
final ImageDownloader slowNetworkDownloader;

Builder模式构建对象,上述的很多变量都是通过外部传入。我们只看几个变量的初始值。

  • 线程池中线程数量默认是3
  • 线程的优先级是Thread.NORM_PRIORITY - 2
  • 队列中处理算法是QueueProcessingType.FIFO

如果没有指定config的配置,则采用默认的配置,通过工厂模式创建一系列初始化值。

创建的初始值如下:

  • taskExecutor
  • taskExecutorForCachedImages
  • diskCache
  • memoryCache
  • downloader
  • decoder

下面我们看看DefaultConfigurationFactory的源码

默认配置工厂类可以创建任务执行者 taskExecutor, taskExecutorForCachedImages

public static Executor createExecutor(int threadPoolSize, int threadPriority,
QueueProcessingType tasksProcessingType) {
//初始化队列算法类型 默认为LIFO
boolean lifo = tasksProcessingType == QueueProcessingType.LIFO;
//初始化队列 根据不同的算法类型,创建不同的队列
BlockingQueue<Runnable> taskQueue =
lifo ? new LIFOLinkedBlockingDeque<Runnable>() : new LinkedBlockingQueue<Runnable>();
return new ThreadPoolExecutor(threadPoolSize, threadPoolSize, 0L, TimeUnit.MILLISECONDS, taskQueue,
createThreadFactory(threadPriority, "uil-pool-"));
}

其主要的事情 就是创建阻塞队列,根据QueueProcessingType的类型,创建各种类型的阻塞队列。

在执行该方法的时候,如果我们没有指定的话 在ImageLoaderConfiguration中是FIFO,先入先出。

taskExecutor和taskExecutorForCachedImages有一样的初始化方法,和参数

下面 我们看看各种缓存的初始化

针对DiskCache,代码如下:

public static DiskCache createDiskCache(Context context, FileNameGenerator diskCacheFileNameGenerator,
long diskCacheSize, int diskCacheFileCount) {
//创建备用缓存文件
File reserveCacheDir = createReserveDiskCacheDir(context);
if (diskCacheSize > 0 || diskCacheFileCount > 0) {
File individualCacheDir = StorageUtils.getIndividualCacheDirectory(context);
try {
//创建本地文件系统缓存器
return new LruDiskCache(individualCacheDir, reserveCacheDir, diskCacheFileNameGenerator, diskCacheSize,
diskCacheFileCount);
} catch (IOException e) {
L.e(e);
// continue and create unlimited cache
}
}
//创建无限制的文件缓存器
File cacheDir = StorageUtils.getCacheDirectory(context);
return new UnlimitedDiskCache(cacheDir, reserveCacheDir, diskCacheFileNameGenerator);
}

这边可以看出 当LruDiskCache不能用时,会创建一个无限制文件缓存。

针对MemoryCache,代码如下:

public static MemoryCache createMemoryCache(Context context, int memoryCacheSize) {
if (memoryCacheSize == 0) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
int memoryClass = am.getMemoryClass();
if (hasHoneycomb() && isLargeHeap(context)) {
memoryClass = getLargeMemoryClass(am);
}
memoryCacheSize = 1024 * 1024 * memoryClass / 8;
}
return new LruMemoryCache(memoryCacheSize);
}

memoryCacheSize是每个App的限制内存大小,memoryCache的大小是App限制大小的1/8

默认配置工厂还创建了图片默认的下载器BaseIamgeDownloader以及图片默认的解码器BaseImageDecoder

这个我们后面再分析。

到现在,已经完成了UIL初始化的时候的各种配置,下一篇我们看一下在使用的时候,其内部的流程。

Universal-Image-Loader源码分析(一)——ImageLoaderConfiguration分析的更多相关文章

  1. ArrayList源码和多线程安全问题分析

    1.ArrayList源码和多线程安全问题分析 在分析ArrayList线程安全问题之前,我们线对此类的源码进行分析,找出可能出现线程安全问题的地方,然后代码进行验证和分析. 1.1 数据结构 Arr ...

  2. Okhttp3源码解析(3)-Call分析(整体流程)

    ### 前言 前面我们讲了 [Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f) [Okhttp3源码解析(1)-OkHttpClient分析]( ...

  3. Okhttp3源码解析(2)-Request分析

    ### 前言 前面我们讲了 [Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f) [Okhttp3源码解析(1)-OkHttpClient分析]( ...

  4. Spring mvc之源码 handlerMapping和handlerAdapter分析

    Spring mvc之源码 handlerMapping和handlerAdapter分析 本篇并不是具体分析Spring mvc,所以好多细节都是一笔带过,主要是带大家梳理一下整个Spring mv ...

  5. HashMap的源码学习以及性能分析

    HashMap的源码学习以及性能分析 一).Map接口的实现类 HashTable.HashMap.LinkedHashMap.TreeMap 二).HashMap和HashTable的区别 1).H ...

  6. ThreadLocal源码及相关问题分析

    前言 在高并发的环境下,当我们使用一个公共的变量时如果不加锁会出现并发问题,例如SimpleDateFormat,但是加锁的话会影响性能,对于这种情况我们可以使用ThreadLocal.ThreadL ...

  7. 物联网防火墙himqtt源码之MQTT协议分析

    物联网防火墙himqtt源码之MQTT协议分析 himqtt是首款完整源码的高性能MQTT物联网防火墙 - MQTT Application FireWall,C语言编写,采用epoll模式支持数十万 ...

  8. Netty 源码学习——客户端流程分析

    Netty 源码学习--客户端流程分析 友情提醒: 需要观看者具备一些 NIO 的知识,否则看起来有的地方可能会不明白. 使用版本依赖 <dependency> <groupId&g ...

  9. linux源码Makefile的详细分析

    目录 一.概述 1.本文的意义 2.Linux内核Makefile文件组成 二.Linux内核Makefile的“make解析”过程 1 顶层Makefile阶段 1.从总目标uImage说起 2.v ...

  10. lesson8:AtomicInteger源码解析及性能分析

    AtomicInteger等对象出现的目的主要是为了解决在多线程环境下变量计数的问题,例如常用的i++,i--操作,它们不是线程安全的,AtomicInteger引入后,就不必在进行i++和i--操作 ...

随机推荐

  1. JavaScript学习总结(五)——jQuery插件开发与发布

    jQuery插件就是以jQuery库为基础衍生出来的库,jQuery插件的好处是封装功能,提高了代码的复用性,加快了开发速度,现在网络上开源的jQuery插件非常多,随着版本的不停迭代越来越稳定好用, ...

  2. XML反序列化出错,XML 文档(2, 2)中有错误

    XML转换为实体类的错误处理方案 一.错误描述: XML反序列化出错,XML 文档(2, 2)中有错误 二.解决方案: 在实体类的字段要加上XmlElement属性 三.具体实现: 1.XML文档 & ...

  3. Redis有序集合操作

    有序集合存储着成员和分值之间的映射,并且提供了分值处理命令,以及根据分值大小有序的获取或扫描成员和分值的命令 (常用命令) ZADD : ZADD key-name score member [sco ...

  4. 全局唯一订单号生成方法(参考snowflake)

    backgroud Snowflake is a network service for generating unique ID numbers at high scale with some si ...

  5. 从xml文件取值

    假设有个 test.xml,包含以下字段: <config> <property name="login_protocol" value="http&q ...

  6. javaer有福了,基于Web的mysql数据库管理工具TreeSoft发布了。

    基于Web的数据库管理工具TreeSoft数据库管理系统发布快3年了,版本不断更快速迭代开发中,QQ群也积累了300多位粉丝,虽然时不时也掉粉,但总体还是增加中.大家虽然捐赠不多,但是苍蝇再小也是肉啊 ...

  7. RocketMQ 消息发送

    消息发送基本流程: 1.消息验证 验证主题(topic),消息体不能为空和大小不能超过4M. 2.路由查找 a.查看缓存,是否有topic的路由信息. b.如果没有则到NameServer中获取路由信 ...

  8. 01-Javascript简介(了解)

    [转]01-Javascript简介(了解) Web前端有三层: HTML:从语义的角度,描述页面结构 CSS:从审美的角度,描述样式(美化页面) JavaScript:从交互的角度,描述行为(提升用 ...

  9. 设计模式(19)--Observer(观察者模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图( ...

  10. js-对象深度克隆方法

    学习收藏. 1.来自http://www.cnblogs.com/yxz-turing/p/4784861.html function cloneObj(obj){ var str, newobj = ...