ImageLoader 筆記
1、ImageLoaderEngine:任務分發器,負責分發LoadAndDisplayImageTask和ProcessAndDisplayImageTask給具體的線程池去執行;
LoadAndDisplayImageTask:用於加載並顯示圖片的任務;ImageDownloader:圖片下載器,負責從圖片的各個來源獲取輸入流;
ImageDecoder:圖片解碼器,負責將圖片輸入流InputStream轉換爲Bitmap對象;
BitmapProcessor:圖片處理器,負責從緩存讀取或寫入前對圖片進行處理;
DisplayBitmapTask:用於顯示圖片的任務;
ProcessAndDisplayImageTask:用於處理並顯示圖片的任務;
2、Cache:圖片緩存,分爲MemoryCache和DiskCache兩部分;
MemoryCache:內存圖片緩存,可向內存緩存緩存圖片或從內存緩存讀取圖片,Map<String, Bitmap>結構,Map的key值爲:圖片的URL + "_" + width x height ;
DiskCache:本地圖片緩存,可向本地磁盤緩存保存圖片或從本地磁盤讀取圖片,文件名默認用:圖片的URL的HashCode;
3、默認緩存文件路徑
有sd卡時默認指定在SD卡根目錄/Android/data/包名/cache/下
無sd卡時,默認先存儲在context.getCacheDir下,如果不存在就存儲在
data/data/包名/cache/下
參考:ImageLoaderConfiguration.Builder類中的initEmptyFieldsWithDefaultValues方法
如果沒有指定緩存路徑,採用默認的,那就可以使用StorageUtils.getCacheDirectory(getApplicationContext())來獲取sd卡的緩存路徑,進而計算大小。
4、指定緩存文件的緩存路徑
new ImageLoaderConfiguration.Builder(context).discCache(discCache)
可指定的類有:
BaseDiscCache.class
LimitedAgeDiscCache.class
UnlimitedDiscCache.class
附:計算文件大小,android.text.format.Formatter.formatFileSize(context, long)轉換文件大小,單位自帶
public static long getDirSize(File file) {
//判斷文件是否存在
if (file != null && file.exists()) {
//如果是目錄則遞歸計算其內容的總大小
if (file.isDirectory()) {
File[] children = file.listFiles();
long size = 0;
for (File f : children)
size += getDirSize(f);
return size;
} else {//如果是文件則直接返回其大小
long size = file.length();
return size;
}
} else {
return 0;
}
}
5、線程池:
線程池的默認大小是3,優先級默認是4,範圍是1到106、圖片加載順序
先從MemoryCache中加載,如果沒有就從DiskCache(需要設置開啓)中加載,如果加載失敗,則從網絡上獲取圖片(因此,服務器端更換圖片時是需要更換地址的,同一個地址在cache存在時是不進行第二次網絡獲取的)
7、使用
(1)初始化
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.discCacheFileNameGenerator(new Md5FileNameGenerator()
.tasksProcessingOrder(QueueProcessingType.LIFO)
.build();
ImageLoader.getInstance().init(config);
(2)加載圖片
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.ic_stub) //加載開始默認的圖片
.showImageOnLoading(R.drawable.gameicon_0)
.showImageForEmptyUri(R.drawable.ic_empty) //url爲空會顯示該圖片,自己放在drawable裏面的
.showImageOnFail(R.drawable.ic_error) //加載圖片出現問題,會顯示該圖片
.cacheInMemory() //緩存用
.cacheOnDisc() //緩存用
.displayer(new RoundedBitmapDisplayer(5)) //圖片圓角顯示,值爲整數
.build();
ImageLoader.getInstance().displayImage(url, imageView,options);
對於本地圖片的加載:在其絕對地址前面要加入"file://"
String imageUri = "file:///mnt/sdcard/image.png"; //SD卡圖片
(3)ListView滾動時不加載圖片
使用GridView,ListView來顯示大量的圖片,而當我們快速滑動GridView,ListView,我們希望能停止
圖片的加載,而在GridView,ListView停止滑動的時候加載當前界面的圖片,這個框架當然也提供這個
功能,使用起來也很簡單,它提供了PauseOnScrollListener這個類來控制ListView,GridView滑動過程
中停止去加載圖片,該類使用的是代理模式
listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
gridView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
第一個參數就是我們的圖片加載對象ImageLoader, 第二個是控制是否在滑動過程中暫停加載圖片,如果
需要暫停傳true就行了,第三個參數控制猛的滑動界面的時候圖片是否加載
http:// site.com/image.png
file:/// mnt/sdcard/image.png
file:/// mnt/sdcard/video.mp4
content:// media/external/images/media/13
content://media/external/video/media/13
assets:// image.png
drawable://R.drawable.img
可以這麼使用
assets: Scheme.ASSETS.wrap(path)
drawable: Scheme.DRAWABLE.wrap(path)
file: Scheme.FILE.wrap(path)
content: Scheme.CONTENT.wrap(path)
http: Scheme.HTTP.wrap(path)
https: Scheme.HTTPS.wrap(path)