天天看點

Android-Universal-Image-Loader圖檔加載架構使用

一、介紹

Android-Universal-Image-Loader是一個非常強大的開源的圖檔異步加載庫,提供一個可重複使用的儀器為異步圖像加載,緩存和顯示,而且使用也非常簡單。使用它我們可以少考慮加載圖檔遇到的多線程,緩存,記憶體溢出等很多方面的問題。國内外很多有名的應用程式都有使用,在該類庫的預設緩存檔案夾中甚至發現了google, instagram, qq, baidu都有在用。

Android-Universal-Image-Loader的代碼托管在GitHub上:https://github.com/nostra13/Android-Universal-Image-Loader

本文已同步到個人對立域名部落格:http://www.fengchaokm.com/

加載顯示任務流

Android-Universal-Image-Loader圖檔加載架構使用

二、特點

多線程的圖像加載

盡可能多的配置選項(線程池,加載器,解析器,記憶體/磁盤緩存,顯示參數等等)

圖檔可以緩存在記憶體中,或者裝置檔案目錄下,或者SD卡中

可以添加圖檔加載監聽器

可以自定義顯示每一張圖檔時都帶不同參數

支援Widget

Android 1.5以上支援

1.9.4+版本添加了一個新的API:DisplayImageOptions.targetSize(ImageSize),提供可設定圖檔的大小。

三、使用方法

1、涉及權限:

通過網絡加載圖檔涉及到網絡請求權限

緩存設定需要設定權限

2、URL類型:

"http://site.com/image.png" // from Web 從網絡擷取
"file:///mnt/sdcard/image.png" // from SD card 從SD卡擷取
"file:///mnt/sdcard/video.mp4" // from SD card (video thumbnail)
"content://media/external/images/media/13"//from content provider 從内容提供器擷取
"content://media/external/video/media/13" // from content provider (video thumbnail)
"assets://image.png" // from assets 從assets目錄擷取
"drawable://" + R.drawable.img // from drawables (non-9patch images)
           

3、MyApplication class

public class MyApplication extends Application {
    @Override
    public void onCreate() {
    super.onCreate();
    File cacheDir = StorageUtils.getCacheDirectory(getApplicationContext());
Environment.getExternalStorageDirectory().getPath());
//ImageLoaderConfiguration 
所有的選項都是可選的,隻選擇你真正想制定的去配置
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
                getApplicationContext())
    // 如果圖檔尺寸大于了這個參數,那麼就會這按照這個參數對圖檔大小進行限制并緩存
                .memoryCacheExtraOptions(, )
                .taskExecutor(AsyncTask.sExecutor)
                .taskExecutorForCachedImages(AsyncTask.sExecutor)
                .threadPoolSize()
                .threadPriority(Thread.NORM_PRIORITY-)
                .threadPriority(Thread.NORM_PRIORITY - )
                .tasksProcessingOrder(QueueProcessingType.FIFO)
                .denyCacheImageMultipleSizesInMemory()
                .memoryCache(new LruMemoryCache( *  * ))
                .memoryCacheSize( *  * )
                .diskCache(new UnlimitedDiscCache(cacheDir))
                .diskCacheSize( *  * )
                .diskCacheFileCount()
                .writeDebugLogs()
                .build();
        ImageLoader.getInstance().init(config);
    }
}
           

Display Options

顯示參數可以分别被每一個顯示任務調用(ImageLoader.displayImage(…))

DisplayImageOptions options = new DisplayImageOptions.Builder()
    .showStubImage(R.drawable.ic_stub)  // 在顯示真正的圖檔前,會加載這個資源
    .showImageForEmptyUri(R.drawable.ic_empty) //空的Url時
    .showImageOnFail(R.drawable.ic_error) 
    .resetViewBeforeLoading() // 
    .delayBeforeLoading()     // 延長1000ms 加載圖檔  (想不出來用在什麼場景下)
    .cacheInMemory()              
    .cacheOnDisc()               
    .preProcessor(...)            
    .postProcessor(...)           
    .extraForDownloader(...)      //可以向加載器攜帶一些參數 
    .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default  
    .bitmapConfig(Bitmap.Config.ARGB_8888) // default
    .decodingOptions(...)
    .displayer(new SimpleBitmapDisplayer()) // default
    .handler(new Handler()) // default
    .build();
           

簡單執行個體

//無回調方法
imageLoader.displayImage(imageUri, imageView);
// 有回調方法
imageLoader.loadImage(imageUri, new SimpleImageLoadingListener() {
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        // Do whatever you want with Bitmap
    }
});
// 傳回Bitmap對象
Bitmap bmp = imageLoader.loadImageSync(imageUri);
           

完整版

// Load image, decode it to Bitmap and display Bitmap in ImageView (or any other view 
//  which implements ImageAware interface)
imageLoader.displayImage(imageUri, imageView, options, new ImageLoadingListener() {
    @Override
    public void onLoadingStarted(String imageUri, View view) {
        ...
    }
    @Override
    public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
        ...
    }
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        ...
    }
    @Override
    public void onLoadingCancelled(String imageUri, View view) {
        ...
    }
}, new ImageLoadingProgressListener() {
    @Override
    public void onProgressUpdate(String imageUri, View view, int current, int total) {
        ...
    }
});


// Load image, decode it to Bitmap and return Bitmap to callback
ImageSize targetSize = new ImageSize(, ); // result Bitmap will be fit to this size
imageLoader.loadImage(imageUri, targetSize, options, new SimpleImageLoadingListener() {
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        // Do whatever you want with Bitmap
    }
});

// Load image, decode it to Bitmap and return Bitmap synchronously
ImageSize targetSize = new ImageSize(, ); // result Bitmap will be fit to this size
Bitmap bmp = imageLoader.loadImageSync(imageUri, targetSize, options);
           

歡迎大家關注我的個人微信公衆号AndroidSharer,分享軟體開發相關技術包括Android、Java Web、HTML5以及産品研發幹貨,偶爾喝點雞湯

Android-Universal-Image-Loader圖檔加載架構使用