android Universal-Image-Loader
一、介紹
(一)、概要:
Android-Universal-Image-Loader是一個開源的UI元件程式,該專案的目的是實現可重複使用的非同步影象載入、快取和顯示。所以,如果你的程式裡需要這個功能的話,使用它,因為已經封裝好了一些類和方法。其實,寫一個這方面的程式還是比較麻煩的,要考慮多執行緒,快取,記憶體溢位等很多方面。
(二)、功能概要:
- 多執行緒圖片載入;
- 靈活更改ImageLoader的基本配置,包括最大執行緒數、快取方式、圖片顯示選項等;
- 圖片非同步載入快取機制,包括記憶體快取(軟引用)及本地快取;
- 對載入過程實現監聽和事件處理;
- 能夠配置載入圖片的顯示選項,包括圖片圓角處理和載入完成顯示動畫等;
(三)、不僅用於載入網路圖片,還可以載入本地圖片。
String imageUri = "http://site.com/image.png"; // from Web
String imageUri = "file:///
String imageUri = "content://media/external/audio/albumart/13"; // from content provider
String imageUri = "assets://image.png"; // from assets
String imageUri = "drawable://" + R.drawable.image; // from drawables (only images, non-9patch)
二、基本使用
(一)、使用步驟:
1、下載jar包universal-image-loader-x.x.x-with-sources.jar並匯入工程
2、配置Manifest檔案,新增網路請求和訪問外部儲存的許可權,因為要進行網路請求和本地快取
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
3、實現自定義的MyApplication類,並初始化ImageLoader,注意要在Manifest的Application標籤註明
android:name=".MyApplication",否則還是使用的預設的Application類。
【 核心程式碼 】
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
.threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.discCacheFileNameGenerator(new Md5FileNameGenerator())
.tasksProcessingOrder(QueueProcessingType.LIFO)
.enableLogging() // Not necessary in common
.build();
ImageLoader.getInstance().init(config);
}
}
【 備註 】
ImageLoaderConfiguration 配置中的.discCacheFileNameGenerator()方法是將快取下來的檔案的命名,可以呼叫的方法有:
1)、new Md5FileNameGenerator() //使用MD5對UIL進行加密命名
2)、new HashCodeFileNameGenerator()//使用HASHCODE對UIL進行加密命名
4、配置圖片顯示選項——DisplayImageOptions 的設定:
【 核心程式碼 】
DisplayImageOptions options;
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_launcher) //設定圖片在下載期間顯示的圖片
.showImageForEmptyUri(R.drawable.ic_launcher) //設定圖片Uri為空或是錯誤的時候顯示的圖片
.showImageOnFail(R.drawable.ic_launcher) //設定圖片載入/解碼過程中錯誤時候顯示的圖片
.cacheInMemory(true) //設定下載的圖片是否快取在記憶體中
.cacheOnDisc(true) //設定下載的圖片是否快取在SD卡中
.considerExifParams(true) //是否考慮JPEG影象EXIF引數(旋轉,翻轉)
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED) //設定圖片以如何的縮放型別
.bitmapConfig(Bitmap.Config.RGB_565) //設定圖片質量——解碼型別
.decodingOptions(android.graphics.BitmapFactory.Options decodingOptions) //設定圖片的解碼配置
//.delayBeforeLoading(int delayInMillis)//int delayInMillis為你設定的下載前的延遲時間
//設定圖片加入快取前,對bitmap進行設定
//.preProcessor(BitmapProcessor preProcessor)
.resetViewBeforeLoading(true) //設定圖片在下載前是否重置,復位
.displayer(new RoundedBitmapDisplayer(20)) //是否設定為圓角,弧度為多少
.displayer(new FadeInBitmapDisplayer(100)) //是否圖片載入好後漸入的動畫時間
.build(); //構建完成
【 備註 】
以上配置中:
1)、imageScaleType(ImageScaleType imageScaleType) 是設定圖片的縮放方式
縮放型別mageScaleType有:
EXACTLY :影象將完全按比例縮小到目標大小
EXACTLY_STRETCHED:圖片會縮放到目標大小完全
IN_SAMPLE_INT:影象將被二次取樣的整數倍
IN_SAMPLE_POWER_OF_2:圖片將降低2倍,直到下一減少步驟,使影象更小的目標大小
NONE:圖片不會調整
2)、displayer(BitmapDisplayer displayer) 是設定圖片的顯示方式
顯示方式displayer有:
RoundedBitmapDisplayer(int roundPixels)設定圓角圖片
FakeBitmapDisplayer()這個類什麼都沒做
FadeInBitmapDisplayer(int durationMillis)設定圖片漸顯的時間
SimpleBitmapDisplayer()正常顯示一張圖片
5、實現載入圖片的方法:
1)、載入預設配置的圖片:
public void displayImage(String uri, ImageView imageView);
引數1:uri代表圖片的URL地址,
引數2:imageView代表承載圖片的IMAGEVIEW控制元件
例如:
imageLoader.displayImage(imageUrl, imageView);
2)、載入自定義配置的圖片:
public void displayImage(String uri, ImageView imageView, DisplayImageOptions options);
引數1:uri代表圖片的URL地址;
引數2:imageView代表承載圖片的IMAGEVIEW控制元件;
引數3:options代表DisplayImageOptions配置檔案
例如:
imageLoader.displayImage(imageUrl, imageView,options);
3)、圖片載入時帶載入情況的監聽:
public void displayImage(String uri, ImageView imageView, DisplayImageOptions options, ImageLoadingListener listener);
引數4:ImageLoadingListener 用於監聽圖片的下載情況;
例如:
imageLoader.displayImage(imageUrl, imageView, options, new ImageLoadingListener() {
@Override
public void onLoadingStarted() {
//開始載入的時候執行
}
@Override
public void onLoadingFailed(FailReason failReason) {
//載入失敗的時候執行
}
@Override
public void onLoadingComplete(Bitmap loadedImage) {
//載入成功的時候執行
}
@Override
public void onLoadingCancelled() {
//載入取消的時候執行
}});
4、圖片載入時帶監聽又帶載入進度條的情況:
public void loadImage(String uri, ImageSize targetImageSize, DisplayImageOptions options,
ImageLoadingListener listener, ImageLoadingProgressListener progressListener);
例如:
imageLoader.displayImage(imageUrl, imageView, options, new ImageLoadingListener() {
@Override
public void onLoadingStarted() {
//開始載入的時候執行
}
@Override
public void onLoadingFailed(FailReason failReason) {
//載入失敗的時候執行
}
@Override
public void onLoadingComplete(Bitmap loadedImage) {
//載入成功的時候執行
}
@Override
public void onLoadingCancelled() {
//載入取消的時候執行
},
new ImageLoadingProgressListener() {
@Override
public void onProgressUpdate(String imageUri, View view, int current,int total) {
//在這裡更新 ProgressBar的進度資訊
}
});
【備註:】
使用ImageLoader載入圖片,這裡以在ListView中為每個item非同步載入圖片為例,只要在Adapter的getView方法中呼叫如下方法即完成了非同步列表圖片載入,其中options是之前定義的圖片載入和顯示選項,animateFirstListener是當圖片第一次載入的監聽事件,目的在於顯示一個淡入的顯示效果動畫,可以新增其他事件
另外,本例還實現了當列表滑動過程中暫停載入和在使用者手放開時才開始載入的功能,這樣的好處是保證在列表圖片非同步載入的過程中不出現卡頓的現象,保證載入的順滑性。實現這一功能的手段是使ListView監聽一個由ImageLoader包含的監聽事件PauseOnScrollListener。
若設定cacheOnDisc(true)的話,則快取的檔案可以在/sdcard/Android/data/[package_name]/cache目錄下看到。不過建議定期清理快取,否則時間一長,SD卡就會被佔滿了,同時也可以在ImageLoaderConfiguration中配置SD的快取策略,有限制快取檔案數量的,有限制快取檔案最大尺寸等選項。
如果在使用過程中遭遇OOM異常,則建議在ImageLoaderConfiguration中設定threadPoolSize在1-5之間合適。在DisplayOption配置時使用。
三、Demo案例:
(一)、注意事項 :
1、上述提到的2個許可權必須加入,否則會出錯
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2、ImageLoaderConfiguration必須配置並且全域性化的初始化這個配置ImageLoader.getInstance().init(config); 否則也會出現錯誤提示
3、ImageLoader是根據ImageView的height,width確定圖片的寬高。
4、如果經常出現OOM
①、減少配置之中執行緒池的大小,(.threadPoolSize).推薦1-5;
②、使用.bitmapConfig(Bitmap.config.RGB_565)代替ARGB_8888;
③、使用.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者 .imageScaleType(ImageScaleType.EXACTLY);
④、避免使用RoundedBitmapDisplayer.他會建立新的ARGB_8888格式的Bitmap物件;
⑤、使用.memoryCache(new WeakMemoryCache()),不要使用.cacheInMemory();
(二)、簡單描述一下這個專案的結構:
每一個圖片的載入和顯示任務都執行在獨立的執行緒中,除非這個圖片快取在記憶體中,這種情況下圖片會立即顯示。如果需要的圖片快取在本地,他們會開啟一個獨立的執行緒佇列。如果在快取中沒有正確的圖片,任務執行緒會從執行緒池中獲取,因此,快速顯示快取圖片時不會有明顯的障礙。