ImageLoader 筆記

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到10


6、圖片加載順序

先從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就行了,第三個參數控制猛的滑動界面的時候圖片是否加載

(4)Uri 參數:

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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章