Android中有不少關於圖片加載的開源框架,比如著名的Android-Universal-Image-Loader,最近在項目中也需要加載圖片,然後就去用了UIL,結果發現有許多功能UIL並沒有提供,雖然可以通過某些方法勉強滿足需求,但是到後面就會發現,項目越來越難維護和擴展了,因此自己就寫了一個圖片加載的框架KImageLoader。
KImageLoader開源框架Github地址:https://github.com/dolpphins/KImageLoader
一、KImageLoader功能及特點
1.既可以實現一對一加載,也可以實現一對多加載模式(即一個url對應多個ImageView)
有時會遇到同時將一個url對應的圖片加載顯示到多個ImageView上的需求,比如在優化流量時如果多個ImageView要顯示的圖片的url都是同一個,那麼就可以把它們合併爲一個請求以節省流量。UIL並沒有爲此提供直接的API,它的displayImage方法接收的都是一個ImageView對象,當然我們可以通過監聽器自行擴展實現該需求。而KImageLoader的displayImage方法既可以接收單個ImageView對象,也可以接收一個ImageView集合。
2.可以指定是否自動創建磁盤緩存目錄
在磁盤緩存目錄不存在的情況下可以指定是否自動創建目錄,這個可以簡化外部程序代碼。
3.可以指定從特定的源加載圖片
比如我們可以指定只從內存緩存和磁盤緩存中加載圖片,如果沒有就直接返回,而不是進一步通過網絡去獲取圖片。這個功能的一個使用場景就是在ListView快速滑動優化時可能會用到,ListView快速滑動時,滑過的Item的getView方法都會被調用,但我們並不會去加載相應的圖片,不過如果什麼都不加載是有問題的,由於ListView的View複用機制,用戶會看到滑過的Item的圖片顯示的是上一次該View被使用時的圖片,這顯然是不對的,當然我們可以一律擦除設置爲默認圖片,但這樣用戶體驗不好。因此我們可以採取這種策略:快速滑動ListView,從內存緩存中讀取圖片(或者進一步從磁盤緩存中讀),如果沒有就直接返回,等到列表停止滑動才真正去加載圖片,這樣用戶體驗會好很多。
4.可以指定加載的圖片的質量,包括從網絡上獲取
有時服務器上的圖片比較大,但實際上我們的手機分辨率並不高,此時直接加載原圖肯定不行,不僅會浪費用戶流量,而且還會延長圖片加載時間,甚至會導致OOM。這時我們就可以通過計算加載指定質量的圖片就行。當然這個問題的解決方法也可以是服務端計算返回相應的圖片。
5.會自動識別本地文件系統的圖片路徑,因此可以跟加載網絡圖片一樣加載本地文件系統上的圖片。
UIL並不能直接加載一個本地圖片文件路徑,而需要指定相應的協議,這也使得代碼變得更加複雜,而KImageLoader可以直接加載一個本地圖片文件路徑的圖片。
6.可以設置獲取圖像線程優先級。
有時我們需要設置某些圖片先加載,加載完再去加載其它圖片,這時就需要指定其加載圖片線程的優先級,KImageLoader中使用了PriorityBlockingQueue作爲圖片加載線程隊列,因此可以通過設置任務的優先級來指定其圖片加載線程的優先既,默認情況下所有圖片加載線程的優先級都是相同的。
7.類及方法數量少,架構簡單,容易使用。
二、使用KImageLoader
使用方法基本和UIL一樣,代碼中包含了所有支持配置和圖片加載選項。
imageLoader = ImageLoader.getInstance();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder()
.setDiskCacheMaxSize(2 * 1024 * 1024 * 1024L) //磁盤緩存大小
.setDiskCachePath("/sdcard/KImageLoader") //磁盤緩存目錄
.isAutoCreateCacheDir(true) //磁盤緩存目不存在時是否自動創建錄,默認爲false
.build();
imageLoader.setImageLoaderConfiguration(config);
ImageLoaderOptions opts = new ImageLoaderOptions.Builder()
.cacheInMemory(true) //允許內存緩存
.cacheInDisk(true) //允許磁盤緩存
.setLoadingDrawableId(R.drawable.ic_launcher) //加載圖片時顯示的圖片
.setLoadedfailDrawableId(R.drawable.image_emoticon10) //加載圖片失敗顯示的圖片
.loadFromMemory(false) //是否允許從內存緩存中讀取
.loadFromDisk(false) //是否允許從磁盤緩存中讀取
.loadFromNetwork(true) //是否允許通過網絡加載圖片
.setBitmapOptions(null) //指定要加載的圖片的質量等
.build();
String url = "http://img2.imgtn.bdimg.com/it/u=2702123953,998736265&fm=21&gp=0.jpg";
ImageView imageView = (ImageView) findViewById(R.id.iv);
imageLoader.displayImage(getApplicationContext(), url, imageView, opts);
轉載請註明原文地址:http://blog.csdn.net/u012619640/article/details/50532888