Universal-Image-Loader源码分析(一)——ImageLoaderConfiguration分析
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分析的更多相关文章
- ArrayList源码和多线程安全问题分析
1.ArrayList源码和多线程安全问题分析 在分析ArrayList线程安全问题之前,我们线对此类的源码进行分析,找出可能出现线程安全问题的地方,然后代码进行验证和分析. 1.1 数据结构 Arr ...
- Okhttp3源码解析(3)-Call分析(整体流程)
### 前言 前面我们讲了 [Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f) [Okhttp3源码解析(1)-OkHttpClient分析]( ...
- Okhttp3源码解析(2)-Request分析
### 前言 前面我们讲了 [Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f) [Okhttp3源码解析(1)-OkHttpClient分析]( ...
- Spring mvc之源码 handlerMapping和handlerAdapter分析
Spring mvc之源码 handlerMapping和handlerAdapter分析 本篇并不是具体分析Spring mvc,所以好多细节都是一笔带过,主要是带大家梳理一下整个Spring mv ...
- HashMap的源码学习以及性能分析
HashMap的源码学习以及性能分析 一).Map接口的实现类 HashTable.HashMap.LinkedHashMap.TreeMap 二).HashMap和HashTable的区别 1).H ...
- ThreadLocal源码及相关问题分析
前言 在高并发的环境下,当我们使用一个公共的变量时如果不加锁会出现并发问题,例如SimpleDateFormat,但是加锁的话会影响性能,对于这种情况我们可以使用ThreadLocal.ThreadL ...
- 物联网防火墙himqtt源码之MQTT协议分析
物联网防火墙himqtt源码之MQTT协议分析 himqtt是首款完整源码的高性能MQTT物联网防火墙 - MQTT Application FireWall,C语言编写,采用epoll模式支持数十万 ...
- Netty 源码学习——客户端流程分析
Netty 源码学习--客户端流程分析 友情提醒: 需要观看者具备一些 NIO 的知识,否则看起来有的地方可能会不明白. 使用版本依赖 <dependency> <groupId&g ...
- linux源码Makefile的详细分析
目录 一.概述 1.本文的意义 2.Linux内核Makefile文件组成 二.Linux内核Makefile的“make解析”过程 1 顶层Makefile阶段 1.从总目标uImage说起 2.v ...
- lesson8:AtomicInteger源码解析及性能分析
AtomicInteger等对象出现的目的主要是为了解决在多线程环境下变量计数的问题,例如常用的i++,i--操作,它们不是线程安全的,AtomicInteger引入后,就不必在进行i++和i--操作 ...
随机推荐
- Java - 线程让步和休眠
Java多线程系列--“基础篇”06之 线程让步 概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield ...
- Mybatis插件开发
前面几篇文章介绍了Mybtis中四个重要的对象,其中提到它们都是在Configuration中被创建的,我们一起看一下创建四大对象的方法,代码如下所示: public ParameterHandler ...
- django-分页paginator
分页 Django提供了一些类来帮助你管理分页的数据 -- 也就是说,数据被分在不同页面中,并带有“上一页/下一页”标签.这些类位于 django/core/paginator.py 中. 示例 向 ...
- JavaScript字符串和字符数组
字符串 字符串与字符数组: 字符串:var a = 'ddd'; 字符数组:var arr = 'f','o','o' 相同点: 1.都是类数组 2.都有length属性 3.都有indexOf()和 ...
- 字符串以及for循环
1.基本数据类型概况 1, int整数 2, str字符串 3, bool类型 4, list列表,一般存放大量数据["明星XXX","NBA球星XXX"]里边 ...
- js相关判断
//正则表达式判断是否为空 /^\s*?$/.test(obj) //批量转换方法 function sort(s){return s.match(/\d/g).sort()+'' } //判断是否相 ...
- Why do collection classes appear
package com.itheima_01; import java.util.ArrayList; /* * 为什么会出现集合类: * 我们学习的是面向对象编程语言,而面向对象编程语言对事物的描述 ...
- Spring boot 多模块项目 + Swagger 让你的API可视化
Spring boot 多模块项目 + Swagger 让你的API可视化 前言 手写 Api 文档的几个痛点: 文档需要更新的时候,需要再次发送一份给前端,也就是文档更新交流不及时. 接口返回结果不 ...
- Java学习笔记之异常处理
一.异常的分类 1.由Java虚拟机抛出的异常(Error):程序无法处理的问题,用户不用去进行处理(虚拟机错误丶内存溢出错误丶线程死锁) 2.Exception异常:程序本身可以进行处理的异常 1. ...
- [Java][读书笔记]多线程编程
前言:最近复习java,发现一本很好的资料,<Java2参考大全 (第五版)> Herbert.Schildt.书比较老了,06年的,一些 ...