這個圖片異步載入并緩存的類已經被非常多開發人員所使用,是最經常使用的幾個開源庫之中的一個,主流的應用,隨便反編譯幾個火的項目,都能夠見到它的身影。
? ? ? ?但是有的人并不知道怎樣去使用這庫怎樣進行配置,網上查到的信息對于剛接觸的人來說可能太少了,以下我就把我使用過程中所知道的寫了下來,希望能夠幫助自己和別人更深入了解這個庫的使用和配置。?
? ? ? ? GITHUB上的下載路徑為:https://github.com/nostra13/Android-Universal-Image-Loader?,下載最新的庫文件,而且導入到項目的LIB下便能夠使用。
? ? ? ??該庫以及DEMO本地下載鏈接:下載地址
一、介紹
?Android-Universal-Image-Loader是一個開源的UI組件程序,該項目的目的是提供一個可反復使用的儀器為異步圖像載入,緩存和顯示。所以。假設你的程序里須要這個功能的話,那么最好還是試試它。由于已經封裝好了一些類和方法。
我們 能夠直接拿來用了。
而不用反復去寫了。
事實上,寫一個這方面的程序還是比較麻煩的,要考慮多線程,緩存。內存溢出等非常多方面。但是,你也能夠參考這個樣例來自己寫出更好的程序。在此為大家介紹一下:
二、特點
多線程的圖像載入
的可能性的寬調諧對ImageLoader的配置(線程池的大小,HTTP選項,內存和光盤快速緩存,顯示圖像。以及其它)
的圖像的可能性中的緩存存儲器和/或設備的文件器系統(或SD卡)
能夠“聽”載入過程中
可自己定義每一個顯示的圖像調用分隔的選項
Widget支持
Android 1.5以上支持
簡單描寫敘述一下這個項目的結構:每一個圖片的載入和顯示任務都運行在獨立的線程中,除非這個圖片緩存在內存中。這樣的情況下圖片會馬上顯示。假設須要的圖片緩存在本地,他們會開啟一個獨立的線程隊列。
假設在緩存中沒有正確的圖片。任務線程會從線程池中獲取。因此,快速顯示緩存圖片時不會有明顯的障礙。(別人那邊借鑒的這段)
流程圖:
?
三、用法
? 這是 一個開源的Android關于下載顯示圖片的工具類。在這個下載包里面jar文件,用于我們導入項目使用,詳細用法在包里面也含有。
以下是一個樣例:
- <uses-permission?android:name="android.permission.INTERNET"?/>??
- <uses-permission?android:name="android.permission.WRITE_EXTERNAL_STORAGE"?/>??
由于是使用過程中會圖片獲取要通過網絡。而且有緩存設置。所以這2個權限必須要有。
非常多人想知道怎樣設置緩存的文件夾,能夠通過以下方法:
- File?cacheDir?=?StorageUtils.getOwnCacheDirectory(getApplicationContext(),?"imageloader/Cache");??
//這個是你希望的緩存文件的文件夾:imageloader/Cache
之后在ImageLoaderConfiguration的配置文件里通過設置
- .discCache(new?UnlimitedDiscCache(cacheDir))//自己定義緩存路徑??
方法來設置該應用的圖片緩存路徑。
以下我們就來開始看怎樣使用這個圖片異步載入庫把:
一.
? ? ? ? 先要配置ImageLoaderConfiguration這個類實現全局ImageLoader的實現情況。
能夠選擇在Application中初始化設置該類。
- ImageLoaderConfiguration?config?=?new?ImageLoaderConfiguration??
- ????.Builder(context)??
- ????.memoryCacheExtraOptions(480,?800)?//?max?width,?max?height,即保存的每一個緩存文件的最大長寬??
- ????.discCacheExtraOptions(480,?800,?CompressFormat.JPEG,?75,?null)?//?Can?slow?ImageLoader,?use?it?carefully?(Better?don't?use?it)/設置緩存的詳細信息,最好不要設置這個??
- ????.threadPoolSize(3)//線程池內載入的數量??
- ????.threadPriority(Thread.NORM_PRIORITY?-?2)??
- ????.denyCacheImageMultipleSizesInMemory()??
- ????.memoryCache(new?UsingFreqLimitedMemoryCache(2?*?1024?*?1024))?//?You?can?pass?your?own?memory?cache?implementation/你能夠通過自己的內存緩存實現??
- ????.memoryCacheSize(2?*?1024?*?1024)????
- ????.discCacheSize(50?*?1024?*?1024)????
- ????.discCacheFileNameGenerator(new?Md5FileNameGenerator())//將保存的時候的URI名稱用MD5?加密??
- ????.tasksProcessingOrder(QueueProcessingType.LIFO)??
- ????.discCacheFileCount(100)?//緩存的文件數量??
- ????.discCache(new?UnlimitedDiscCache(cacheDir))//自己定義緩存路徑??
- ????.defaultDisplayImageOptions(DisplayImageOptions.createSimple())??
- ????.imageDownloader(new?BaseImageDownloader(context,?5?*?1000,?30?*?1000))?//?connectTimeout?(5?s),?readTimeout?(30?s)超時時間??
- ????.writeDebugLogs()?//?Remove?for?release?app??
- ????.build();//開始構建??
- ????//?Initialize?ImageLoader?with?configuration.??
以上的配置看個人需求進行選擇,不是全部都要進行配置。
配置好ImageLoaderConfiguration后。調用以下方法來實現初始化:
- ImageLoader.getInstance().init(config);//全局初始化此配置??
注:ImageLoaderConfiguration 配置中的.discCacheFileNameGenerator()方法是將緩存下來的文件以什么方式命名
? ? ? ? ? 里面能夠調用的方法有 ?1.new Md5FileNameGenerator() //使用MD5對UIL進行加密命名
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.new?HashCodeFileNameGenerator()//使用HASHCODE對UIL進行加密命名
二.
? ? ? ? 使用ImageLoader進行圖片載入的時候,先要實例化ImageLoader,調用以下方法進行實例化。在每一個布局里面都要實例化后再使用。
- protected?ImageLoader?imageLoader?=?ImageLoader.getInstance();??
之后進行顯示的圖片的各種格式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()正常顯示一張圖片
之后依照需求調用
1.純粹為了載入默認配置的一個圖片的
? 方法:
? public?void?displayImage(String?uri,?ImageView?imageView)?{}
? 詳細實現:
- ImageLoader.getInstance().displayImage(imageUrl,?imageView);?//?imageUrl代表圖片的URL地址,imageView代表承載圖片的IMAGEVIEW控件??
2.載入自己定義配置的一個圖片的
? 方法:
? public?void?displayImage(String?uri,?ImageView?imageView,?DisplayImageOptions?options)?{}
? 詳細實現:
- ImageLoader.getInstance().displayImage(imageUrl,?imageView,options);?//?imageUrl代表圖片的URL地址,imageView代表承載圖片的IMAGEVIEW控件?。?options代表DisplayImageOptions配置文件??
3.圖片載入時候帶載入情況的監聽
? 方法:
?public?void?displayImage(String?uri,?ImageAware?imageAware,?DisplayImageOptions?options,ImageLoadingListener?listener)?{}
? 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的進度信息??
- ??????}??
- ????});??
四、注意事項
? 1.上述提到的2個權限必須增加,否則會出錯
? 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)或者 ? ? ? ?try.imageScaleType(ImageScaleType.EXACTLY);
? ?④避免使用RoundedBitmapDisplayer.他會創建新的ARGB_8888格式的Bitmap對象;
? ?⑤使用.memoryCache(new WeakMemoryCache())。不要使用.cacheInMemory();
以下有人問到怎樣載入本地圖片什么的。之后把那位親的回答補充上來,謝謝各位大大提出的不足(那時候用的時候僅僅想到用網絡圖片了,所以也沒考慮這么多)。
- String?imageUri?=?"http://site.com/image.png";?//?from?Web??
- String?imageUri?=?"file:///mnt/sdcard/image.png";?//?from?SD?card??
- 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) ?
? ? 大致就講到這里。可能有的地方不足歡迎提出。希望大家能夠更加easy入手、使用這個庫。
==========================================================================================
歡迎增加我們的技術交流群:
Android群:?66756039
JavaEE群: ?361579846?