UIl與Volley同樣是很是古老的框架,UIL實現了從網絡獲取圖片,對圖片進行緩存,以及根據個性化的設置來將圖片加載到ImageView上。算法
這篇文章 主要分析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類的成員變量,也是具體的配置選項。app
//資源信息 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模式構建對象,上述的不少變量都是經過外部傳入。咱們只看幾個變量的初始值。框架
若是沒有指定config的配置,則採用默認的配置,經過工廠模式建立一系列初始化值。
建立的初始值以下:源碼分析
下面咱們看看DefaultConfigurationFactory
的源碼ui
默認配置工廠類能夠建立任務執行者 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有同樣的初始化方法,和參數code
下面 咱們看看各類緩存的初始化對象
針對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初始化的時候的各類配置,下一篇咱們看一下在使用的時候,其內部的流程。