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. golang中的接口实现(二)

    指针类型 vs 值类型实现接口 package main import ( "fmt" ) // 定义接口 type Describer interface { Describe( ...

  2. 桥接和nat连接

    桥接网络(Bridged Networking) 桥接网络是指本地物理网卡和虚拟网卡通过VMnet0虚拟交换机进行桥接,物理网卡和虚拟网卡在拓扑图上处于同等地位,物理网卡和虚拟网卡就相当于处于同一个网 ...

  3. ubuntu下安装 Sublime Text 3 及 PlantUML 绘图插件

    ubuntu下只想做C++的程序代码编写,最开始选择了codeblock,主要目的是安装简单,集成度高,还可以调试,但是用的时候老是无故退出,改了半天的代码就这样丢失,挺苦恼的,可能跟自己装的系统比较 ...

  4. win7游戏窗口设置

    在开始搜索框输入regedit打开注册表,定位到HKEY_LOCAL_MACHINE------SYSTEM------ControlSet001-------Control-------Graphi ...

  5. 01-Javascript简介(了解)

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

  6. 鼠标悬浮控制元素隐藏与显示 - css中鼠标的hover状态

    需求:当鼠标移动到一个元素A身上时,另外一个元素B显示. 实现原理: A元素与B元素有一个相同的父级. B元素默认隐藏,A元素默认显示. 当鼠标移动到A元素身上时,也可以看做是移动到了A元素的父级身上 ...

  7. easyui+webuploader+ckeditor实现插件式多图片上传

    需求:在ckeditor编辑器上实现多图片上传并要求另外单独选择ckeditor上传的图片作为封面 页面效果说明: 动态效果图: 第一步:页面布局 <html xmlns="http: ...

  8. x64系统WSC注册方法

    @echo off title 注册WSC脚本部件 echo. ***************************************** echo. 支持x64系统(请以管理员身份运行) e ...

  9. my big day is coming!

    明天博士学位论文答辩,给自己加油! 期望一切顺利!

  10. mac下/usr/local/bin No such file or directory问题解决

    在对composer进行全局配置时,执行 sudo mv composer.phar /usr/local/bin/composer 时,mac报错:/usr/local/bin No such fi ...