1. 程式人生 > >Android-Universal-Image-Loader的工具類封裝

Android-Universal-Image-Loader的工具類封裝

在Android開發中對圖片資源的處理已經司空見慣了,如果還是使用Android API提供的方法來處理圖片(尤其是網路圖片),不僅複雜工作量大,而且還達不到好的一個效果.所以最終選擇一些圖片處理框架,如Android-Universal-Image-Loader,picasso(square出品,必屬精品),Fresco(facebook家的),等等.本文主要就是講Android-Universal-Image-Loader的工具類的封裝,我也封裝過picasso,picasso可能會在下一篇博文裡介紹吧.其實,掌握了一個圖片處理框架就可以掌握其他圖片處理框架.

我使用的開發工具是AS,如果你還在使用Eclipse,那麼趕緊轉到AS吧,AS真的太好用了,真的!

進入正文了:

在你專案app下的build.gradle的dependencies下加入下面這句話就可以將這個框架整合到自己的專案中了.有好幾種方法(你也可以去GitHub上看),選了最方便的,這也是使用AS的好處之一吧.

compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

好了,可以封裝了,直接貼程式碼了.

package com.bighuan.bighuansdk.imageloader;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.ImageView;

import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.WeakMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;

/**
 * 專案名:  Component
 * 包名:    com.bighuan.bighuansdk.imageloader
 * 檔名:  ImageLoaderManager
 * 作者:    bighuan
 * 建立時間:2017/2/28 20:34
 * 描述:    UniverseImageLoader工具類,載入圖片,尤其是網路圖片
 */

public class ImageLoaderManager {

    private static final int THREAD_COUNT = 4;//表明我們的UIL最多可以有多少條執行緒
    private static final int PRIORITY = 2;    //圖片載入的一個優先順序
    private static final int MEMORY_CACHE_SIZE = 2 * 1024 * 1024;//記憶體快取大小
    private static final int DISK_CACHE_SIZE = 50 * 1024 * 1024;//表明UIL最多快取多少圖片
    private static final int CONNECTION_TIME_OUT = 5 * 1000;//連線超時時間
    private static final int READ_TIME_OUT = 30 * 1000;//讀取超時時間

    private static ImageLoaderManager mInstance = null;
    private static ImageLoader mLoader = null;

    public static ImageLoaderManager getInstance(Context context) {

        if (mInstance == null) {
            synchronized (ImageLoaderManager.class) {
                if (mInstance == null) {
                    mInstance = new ImageLoaderManager(context);
                }
            }
        }
        return mInstance;
    }

    /**
     * 私有構造方法完成初始化工作
     *
     * @param context
     */
    private ImageLoaderManager(Context context) {

        ImageLoaderConfiguration configuration = new ImageLoaderConfiguration
                .Builder(context)
                .threadPoolSize(THREAD_COUNT)//配置圖片執行緒下載的最大數量
                .threadPriority(Thread.NORM_PRIORITY - PRIORITY)//設定優先順序
                .denyCacheImageMultipleSizesInMemory()//防止快取多套圖片到記憶體中
                .memoryCache(new WeakMemoryCache())//使用弱引用記憶體快取
                .diskCacheSize(DISK_CACHE_SIZE)//分配硬碟快取大小
                .diskCacheFileNameGenerator(new Md5FileNameGenerator())//使用MD5命名檔案
                .tasksProcessingOrder(QueueProcessingType.LIFO)//圖片下載順序
                .defaultDisplayImageOptions(getDefaultOptions())//預設的圖片載入Options
                .imageDownloader(new BaseImageDownloader(context, CONNECTION_TIME_OUT, READ_TIME_OUT))
                //設定圖片下載器
                .writeDebugLogs()//debug環境下輸出日誌
                .build();

        ImageLoader.getInstance().init(configuration);
        mLoader = ImageLoader.getInstance();
    }

    /**
     * 預設的圖片顯示Options,可設定圖片的快取策略,編解碼方式等,非常重要
     *
     * @return
     */
    private DisplayImageOptions getDefaultOptions() {

        DisplayImageOptions options = new DisplayImageOptions.Builder()
                //                .showImageForEmptyUri(R.drawable...)//圖片地址為空的時候顯示的圖片
                //                .showImageOnFail(R.drawable...)//出錯的時候顯示的圖片
                .cacheInMemory(true)//設定圖片可以快取在記憶體中
                .cacheOnDisk(true)//設定圖片可以快取在硬碟中
                .considerExifParams(true)
                .imageScaleType(ImageScaleType.IN_SAMPLE_INT)
                .bitmapConfig(Bitmap.Config.RGB_565)//使用的圖片解碼型別
                .decodingOptions(new BitmapFactory.Options())//圖片解碼配置
                .resetViewBeforeLoading(true)
                .build();
        return options;

    }

    /**
     * 設定圖片
     *
     * @param imageView
     * @param path
     * @param listener
     * @param options
     */
    public void displayImage(ImageView imageView, String path,
                             ImageLoadingListener listener, DisplayImageOptions options) {
        if (mLoader != null) {
            mLoader.displayImage(path, imageView, options, listener);
        }
    }

    public void displayImage(ImageView imageView, String path, ImageLoadingListener listener) {

        if (mLoader != null) {
            mLoader.displayImage(path, imageView, listener);
        }
    }

    public void displayImage(ImageView imageView, String path) {
        displayImage(imageView, path, null);
    }


}
封裝這個框架主要用了單例模式,程式碼中都有註釋,這裡就不在解釋了,大家肯定也看的懂.通過封裝Android-Universal-Image-Loader,我們在實際使用時只要一兩行程式碼就可以實現想要的效果,而不用寫一大堆程式碼了,大大的減少了程式碼冗餘.好了,本文到此結束,希望能對一些人有幫助.