前言
UniversalImageLoader是用於加載圖片的一個開源項目,在其項目介紹中是這么寫的,
- 支持多線程圖片加載
- 提供豐富的細節配置,比如線程池大小,HTPP請求項,內存和磁盤緩存,圖片顯示時的參數配置等等;
- 提供雙緩存
- 支持加載過程的監聽;
- 提供圖片的個性化顯示配置接口;
- Widget支持(這個,個人覺得沒必要寫進來,不過尊重原文)
其他類似的項目也有很多,但這個作為github上著名的開源項目被廣泛使用。第三方的包雖然好用省力,可以有效避免重復造輪子,但是卻隱藏了一些開發上的細節,如果不關注其內部實現,那么將不利於開發人員掌握核心技術,當然也談不上更好的使用它,計划分析項目的集成使用和低層實現。
正文
clone 項目就不講了,拿到代碼后有兩個主要項目,一份是UniversalImageLoader 的源碼,一份是sample,
加載圖片之前,先要做初始化配置,這個類似很多游戲引擎使用前要做一下初始化,其實只做了一件事,實例化一個全局的ImageLoader對象,同時傳入圖片加載緩存的配置,ImageLoaderConfiguration封裝了基本的配置信息,比如加載圖片事用的線程池大小,線程的優先級,內存緩存大小,是否支持同一圖片的多尺寸緩存(默認是支持的,可以手動關閉),還有緩存的命名規則等等.這基本也就是幾行代碼,下面這張圖里有實例化和初始化的過程。
關於這個實例化,是線程安全,筆者忽略第二層判斷,如果A,B線程同時執行if(instance==null),A,B都滿足條件進入,此時,其中一個換的鎖,另一個等待,還需要再次判斷instance==null(這是必要的,否則可能使得,再次實例化)這樣一個單例就正常初始化了。
配置完后,就可以開始使用了,通過ImageLoader的displayImage()綁定一個圖片和ImageView,該方法有四個重載版本,傳的參數比較多,這也印證了該項目提供每個圖片單獨的顯示配置這一說法。其中參數最全的是:
displayImage(String uri, ImageView imageView, DisplayImageOptions options, ImageLoadingListener listener);
另外三個其實就是減少其中幾個參數用默認的值而已。
String uri, 圖片鏈接沒什么疑問,
ImageView imageView, 圖片載體控件,也沒什么好說,
比較重要的是后面兩個,DisplayImageOptions options,圖片的參數配置對象,
options = new DisplayImageOptions.Builder() .showStubImage(R.drawable.stub_image) .showImageForEmptyUri(R.drawable.image_for_empty_url) .cacheInMemory() .cacheOnDisc() .build();
來看看都有什么信息可以配置的,
第一個是圖片加載過程中顯示的圖片,比如“菊花”圈,
第二個是圖片加載失敗時用的的圖片,
第三個允許內存緩存,第四個允許磁盤緩存。
除此之外還有兩個,imageScaleType(ImageScaleType imageScaleType)圖片縮放類型,displayer(BitmapDisplayer displayer)bitmap顯示控制層,可以在顯示圖片前對Bitmap簡單處理一下,這兩個不是一定要設定,應為他們都有默認值。
最后一個參數ImageLoadingListener listener當然是監聽過程的回調接口