開源框架KImageLoader開發及原理剖析(一)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章