UIl與Volley一樣是非常古老的框架,UIL實現了從網路獲取圖片,對圖片進行緩存,以及根據個性化的設置來將圖片載入到ImageView上。 這篇文章 主要分析UIl在初始化配置的源碼 UIL初始化的源碼分析 UIl提供在Application中進行UIl的初始化操作,常見的初始化操作代碼如下: ...
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初始化的時候的各種配置,下一篇我們看一下在使用的時候,其內部的流程。