zoukankan      html  css  js  c++  java
  • 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初始化的时候的各种配置,下一篇我们看一下在使用的时候,其内部的流程。

  • 相关阅读:
    【原】Storm序列化
    【原】Storm学习资料推荐
    【原】Storm实战
    【原】Storm环境搭建
    Autofac基本使用(转载)
    Autofac学习之三种生命周期:InstancePerLifetimeScope、SingleInstance、InstancePerDependency
    RabbitMQ 默认端口号
    RabbitMQ-客户端
    百度地图-生成器
    uploadify 配置后,页面显示无效果
  • 原文地址:https://www.cnblogs.com/qifengshi/p/7169173.html
Copyright © 2011-2022 走看看