轉載請標明出處:html
http://blog.csdn.net/developer_jiangqq/article/details/50439814
java
本文出自:【江清清的博客】android
(一).前言:
已經半個月沒有更新文章了,一方面是最近工做比較忙,另外一方面我也在選擇博客的題材。此次我主要講解平時用的比較多的圖片加載框架ImageLoader。雖然這個框架前不久做者已經中止更新了,不過這個圖片加載框架我已經用了好久了。我深知框架使用簡即是一方面,可是若是可以不只會使用並且可以深知其中實現的原理纔是最重要的。因此我把ImageLoader項目全部的代碼閱讀了一遍而且給每一個類和相關方法添加了中文版本的註釋。git
本例以及UIL框架所有中文版本註釋項目已經更新到github,有興趣你們能夠去clone,start或者fork。github
地址https://github.com/jiangqqlmj/Android-Universal-Image-Loader-Modify算法
[順便說一下,能夠微信掃描關注左側的二維碼關注訂閱號,獲取最新文章哈~]緩存
本次專題的文章主要會涉及到如下部分ImageLoader的介紹和使用,部分重要模塊分析以及相關源碼講解。今天咱們主要進行第一部分的講解(ImageLoader基礎介紹和使用講解)。微信
(二).ImageLoader基本介紹:
咱們在開發APP的時候確定遇到加載圖片的需求尤爲是列表須要加載大量圖片的時候,那麼咱們勢必須要進行下載圖片而且進行顯示。可是因爲內存等各方面的問題多多少少會遇到一些問題;例如:列表加載圖片,圖片錯亂分佈啦。或者出現OOM問題啦~~這時候咱們須要開發圖片異步加載而且能夠適當壓縮框架。例如:UIL(Universal-Image-Loader,github項目地址UIL項目地址)除此以外還有其餘不少框架Glide,Fresco,Picasso等等不少。後面幾個如今用的比較多並且還在更多。後面的文章我這邊也會分享其餘的圖片加載框架。網絡
UIL(Universal-Image-Loader)旨在提供一個強大的、靈活的和高度可定製的工具圖像加載、緩存和顯示功能。而且提供了許多配置選項和良好控制圖像加載和緩存的過程。因此在以前長久的一段時間裏,該框架的使用很是廣且很方便哦。多線程
UIL框架特色:
- 支持多線程圖片加載(同步或者異步)
- 支持自定義配置ImageLoader,例如線程池,圖片下載器,內存緩存策略,硬盤緩存策略,圖片顯示選項以及其餘的一些配置
- 支持自定義配置圖片顯示,例如:緩存開關選擇,界面選項,圖片加載進度以及顯示
- 支持圖片內存緩存或者文件系統,設備SD緩存
- 支持圖片加載進度監聽(包括圖片下載進度監聽)
- 支持框架更多工具類的擴展
- 一樣能夠支持例如ListView,GridView進行滑動的時候暫停或者恢復圖片加載顯示等功能。
- 固然還有其餘很過特色,具體你們讀了源碼就會知道啦….
(三).ImageLoader快速安裝:
若是咱們要使用ImageLoader你們均可以項目地址下載一份代碼其中會有imageLoader的jar包引入到項目就能夠了。總體項目中內容文件夾以下:

3.1.咱們下載imageloader的jar包到咱們項目libs文件夾中,而後關聯便可(universal-image-loader-1.9.5.jar):
3.2.如今咱們採用Android Studio開發項目了,咱們只須要build.gradle中添加如下依賴便可:
compile'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
3.3.項目配置文件須要添加相關權限(主要爲訪問網絡權限,若是圖片須要sdcard緩存還須要多添加一個權限)
- <manifest>
-
- <uses-permission android:name="android.permission.INTERNET" />
-
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- ...
- </manifest>
3.4.最後咱們須要在第一次使用ImageLoader以前,作一下ImageLoader的基礎配置,該項配置能夠在application或者activity中作便可,以下方式:
- ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
- ...
- .build();
- ImageLoader.getInstance().init(config);
3.5.下面咱們就能夠具體使用ImageLoader來進行加載和顯示圖片啦。
(四).ImageLoader全局配置項(Configuration)
上面3.4中咱們講到了ImageLoader在使用以前須要進行全局配置一下。OK,ImageLoader給咱們提供了一個ImageLoaderConfiguration來進行全局設置ImageLoader。不過該設置是全局的,咱們只須要設置一次便可了。
查看ImageLoader文檔以及ImageLoaderConfiguration源碼發現,該爲咱們提供了全部的配置項都是可選的。除非你須要自定義設置,模板咱們能夠調用該其中默認構造的方法以下:
ImageLoaderConfiguration configuration=ImageLoaderConfiguration.createDefault(this);
ImageLoader.getInstance().init(configuration);
上面的createDefault方法會給咱們默認初始化一些配置項,具體全部配置可選項以下圖:

上面包括設置緩存大小,任務執行器,線程池線程數量,線程權重,任務執行算法,磁盤緩存大小,緩存文件數量,緩存文件命名規則,圖片下載器,解碼器,圖片顯示配置項等等。你們能夠隨意根據項目實際狀況配置便可了。
(五).ImageLoader圖片Display配置項(Display Options)
上面咱們講到了ImageLoader的全局配置,在對於圖片顯示的時候(ImageLoader.displayImage(…)的時候),咱們還能夠設置圖片顯示的參數(主要使用DisplayImageOptions)。Display Options(顯示可選項)用於每次圖片顯示任務的時候(ImageLoader.displayImage()該方法被調用)。
【注意】若是咱們沒有設置圖片顯示配置項,那麼我在顯示圖片的時候會默認調用圖片默認顯示方式。具體可選配置項以下:

上面包括圖片加載過程當中,圖片地址爲空以及圖片加載失敗的圖片,加載延時,開啓內存緩存以及磁盤緩存,圖片縮放類型,圖片編碼類型以及圖片顯示加載器等等參數。具體根據實際項目選擇配置便可。
(六).ImageLoader加載圖片講解
如今咱們開始講解使用ImageLoader加載圖片啦,在這以前你們必定要按照第三點的內容ImageLoader要安裝一下以及作一下基本權限以及全局配置哦~下面咱們首先看一下ImageLoader來顯示圖片的幾個方法:

查看上面ImageLoader的方法圖看:主要分爲下面三種方式加載圖片啦~咱們在項目中通常使用前兩種哦(displayImage和loadImage),由於這兩種是異步的,另外的loadImageSync是同步的啦。
6.1.dispalyImage()方法使用講解:
6.1.1本例中我ImageLoader全局是採用默認配置的以下:
- public class UILApplication extends Application {
- @Override
- public void onCreate() {
- super.onCreate();
- initImageLoader();
- }
- private void initImageLoader(){
- ImageLoaderConfiguration configuration=ImageLoaderConfiguration.createDefault(this);
- ImageLoader.getInstance().init(configuration);
- }
- }
實例佈局文件以下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- androidlayout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:gravity="center">
- <ImageView
- android:id="@+id/test_img_one"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/ic_data_loading"/>
- </LinearLayout>
而後Activitity實例化控件以及ImageLoader,調用displayImage方法便可:
- ImageView test_img_one=(ImageView)this.findViewById(R.id.test_img_one);
- ImageLoader.getInstance().displayImage(ImageDataUtils.ImagesUtils[0],test_img_one);
6.1.2.上邊咱們採用displayImage是兩個參數的方法,咱們同時能夠在這邊加入圖片顯示參數配置以下便可:
- ImageView test_img_one=(ImageView)this.findViewById(R.id.test_img_one);
- DisplayImageOptions options=new DisplayImageOptions.Builder()
- .showImageOnLoading(R.drawable.ic_data_loading)
- .showImageOnFail(R.drawable.ic_data_error)
- .cacheInMemory(true)
- .cacheOnDisk(true)
- .build();
- ImageLoader.getInstance().displayImage(ImageDataUtils.ImagesUtils[1],test_img_one,options);
上面咱們配置加載過程當中和加載失敗顯示的圖片以及開啓內存和磁盤緩存功能運行效果以下:

6.1.3.在顯示的時候咱們還能夠加入圖片的目標尺寸,以下:
- ImageSize size=new ImageSize(100,50);
- ImageLoader.getInstance().displayImage(ImageDataUtils.ImagesUtils[1],test_img_one,size);
這邊構造一個ImageSize對象來定義目標圖片的寬度和高度,傳入寬100,高50,運行效果以下:

6.1.4.除了上面的三個顯示重載方法以外,咱們還能夠傳入一個圖片加載進度監聽器進入,具體接口回調咱們放入到下面loadImage()方法中講解。
6.2.loadImage()方法使用講解:
上面6.1咱們已經對displayImage()方法作了一些講解,如今咱們對於另一個異步加載圖片方法loadImage作一下講解。本例中我這邊採用TwoActivity以及一個簡單佈局:該佈局中就放入一個ImageView便可。全局配置和上面同樣。
6.2.1.loadImage(Stringuri, ImageLoadingListener listener)
該傳入兩個參數第一個爲圖片下載地址,第二個爲圖片加載監聽器首先採用默認的接口以下設置:
- ImageView test_img_two=(ImageView)this.findViewById(R.id.test_img_two);
- ImageLoader.getInstance().loadImage(ImageDataUtils.ImagesUtils[3], new ImageLoadingListener() {
- @Override
- public void onLoadingStarted(String imageUri, View view) {
-
- Log.d("zttjiangqq","onLoadingStarted...");
- }
- @Override
- public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
-
- Log.d("zttjiangqq","onLoadingFailed...");
- }
- @Override
- public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
-
- Log.d("zttjiangqq","onLoadingComplete...");
- test_img_two.setImageBitmap(loadedImage);
- }
- @Override
- public void onLoadingCancelled(String imageUri, View view) {
-
- Log.d("zttjiangqq","onLoadingCancelled...");
- }
- });
具體運行打印的日誌和運行結果以下:


咱們看到使用ImageLoadingListener接口必需要實現接口中四個方法,可是咱們平時實際狀況下可能不須要回調那麼多方法,不錯的是UIL給咱們提供了一個類SimpleImageLoadingListener類,該類實現了ImageLoadingListener接口。咱們傳入該實現類便可,這樣咱們重寫實際所需的方法就方便多了。具體實例以下
- ImageLoader.getInstance().loadImage(ImageDataUtils.ImagesUtils[4],new SimpleImageLoadingListener(){
- @Override
- public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
- super.onLoadingComplete(imageUri, view, loadedImage);
-
- Log.d("zttjiangqq","onLoadingComplete...");
- test_img_two.setImageBitmap(loadedImage);
- }
-
- @Override
- public void onLoadingStarted(String imageUri, View view) {
- super.onLoadingStarted(imageUri, view);
-
- Log.d("zttjiangqq", "onLoadingStarted...");
- }
- });
這邊我只重寫了onLoadingComplete和onLoadingStarted兩個方法,代碼量上面就減小了不少。
6.2.2.loadImage(Stringuri, ImageSize targetImageSize, DisplayImageOptions options,ImageLoadingListenerlistener)
該加載圖片方法6.1中講得差很少,咱們同時能夠傳入圖片顯示配置項,具體示例以下:
- DisplayImageOptions options=new DisplayImageOptions.Builder()
- .showImageOnLoading(R.drawable.ic_data_loading)
- .showImageOnFail(R.drawable.ic_data_error)
- .cacheInMemory(true)
- .cacheOnDisk(true)
- .build();
- ImageLoader.getInstance().loadImage(ImageDataUtils.ImagesUtils[5],options,new SimpleImageLoadingListener(){
- @Override
- public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
- super.onLoadingComplete(imageUri, view, loadedImage);
-
- Log.d("zttjiangqq","onLoadingComplete...");
- test_img_two.setImageBitmap(loadedImage);
- }
- });
6.2.3.loadImage(Stringuri, ImageSize targetImageSize, ImageLoadingListener listener)
該加載圖片方式咱們能夠傳入目標圖片的尺寸大小,用起來直接構造一個ImageSize傳入進去就能夠了。具體方法以下:
- ImageSize size=new ImageSize(100,50);
- ImageLoader.getInstance().loadImage(ImageDataUtils.ImagesUtils[6],size,new SimpleImageLoadingListener(){
- @Override
- public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
- super.onLoadingComplete(imageUri, view, loadedImage);
-
- Log.d("zttjiangqq","onLoadingComplete...");
- test_img_two.setImageBitmap(loadedImage);
- }
- });
6.2.4.主要就是以上幾種方式,其餘的圖片加載方法和以上的差很少,只須要傳入對應的參數就能夠了。
(七).最後總結
今天咱們對於UIL(Universal-Image-Loader)開源框架的介紹和基本使用作了相關講解,包括介紹,安裝,配置以及基本使用方面。下一講會着重講解該開源組件幾個核心的類以及相關使用注意事項。
本例以及UIL框架所有中文版本註釋項目已經更新到github,有興趣你們能夠去clone,start或者fork。
地址https://github.com/jiangqqlmj/Android-Universal-Image-Loader-Modify
尊重原創,轉載請註明:From Sky丶清(http://blog.csdn.net/developer_jiangqq) 侵權必究!