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類的成員變量,也是具體的配置選項。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模式構建對象,上述的不少變量都是經過外部傳入。咱們只看幾個變量的初始值。框架

  • 線程池中線程數量默認是3
  • 線程的優先級是Thread.NORM_PRIORITY - 2
  • 隊列中處理算法是QueueProcessingType.FIFO

若是沒有指定config的配置,則採用默認的配置,經過工廠模式建立一系列初始化值。
建立的初始值以下:源碼分析

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

下面咱們看看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初始化的時候的各類配置,下一篇咱們看一下在使用的時候,其內部的流程。

相關文章
相關標籤/搜索