1. 程式人生 > >Android非同步圖片載入元件之 Universal_image_loader

Android非同步圖片載入元件之 Universal_image_loader

package com.yongninggo.yongningsdk.Universal_image_loader;

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;
import com.yongninggo.yongningsdk.R;

/**
 * @author chao
 * @function  初始化universal_image_loader,載入網路圖片
 */

public class ImageLoaderManager {

    private static final int THREAD_COUNT = 4;   //表示最多可以有4條執行緒
    private static final int PROPRITY = 2;      //表示我們圖片載入的一個優先順序
    private static final int DISK_CACHE_SIZE = 50 * 1024;   //表示最多可以快取多少圖片
    private static final int CONNETION_TIME_OUT = 5 * 1000;     //連線超時時間
    private static final int READ_TIME_OUT = 30 * 1000;     //讀取超時時間

    private static ImageLoaderManager Instance = null;
    private static ImageLoader imageloader = null;

    public static ImageLoaderManager getInstance (Context context){

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

        return Instance;
    }

    //單例模式的私有構造方法
    ImageLoaderManager(Context context) {
        ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)
                .threadPoolSize(THREAD_COUNT)       //配置圖片下載執行緒的最大數量
                .threadPriority(Thread.NORM_PRIORITY - PROPRITY)    //設定優先順序
                .denyCacheImageMultipleSizesInMemory()      //防止快取多套尺寸的圖片到記憶體中
                .memoryCache(new WeakMemoryCache())         //使用弱引用記憶體快取
                .diskCacheSize(DISK_CACHE_SIZE)             //分配硬碟快取大小
                .diskCacheFileNameGenerator(new Md5FileNameGenerator())     //使用Md5命名檔案
                .tasksProcessingOrder(QueueProcessingType.FIFO)         //圖片下載順序
                .defaultDisplayImageOptions(getDefultOptions())         //預設的圖片載入options
                .imageDownloader(new BaseImageDownloader(context,CONNETION_TIME_OUT,READ_TIME_OUT))     //設定圖片下載器
                .writeDebugLogs()       //debug環境下輸出日誌
                .build();

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

    //實現預設的options
    public DisplayImageOptions getDefultOptions() {
        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showImageForEmptyUri(R.drawable.psb)   //在圖片地址為空的時候載入我們定義的圖片
                .showImageOnFail(R.drawable.psb)        //在圖片下載失敗的時候載入我們定義的圖片
                .cacheInMemory(true)            //設定圖片可以快取在記憶體
                .cacheOnDisk(true)              //設定圖片可以快取在硬碟
                .bitmapConfig(Bitmap.Config.RGB_565)    //使用的解碼型別 (RGB_565 降低圖片的色彩,從而減少記憶體的使用)
                .decodingOptions(new BitmapFactory.Options())   //圖片解碼的配置
                .imageScaleType(ImageScaleType.IN_SAMPLE_INT)
                .build();

        return options;
    }

    /**
     * @function 載入圖片api(設定圖片)
     * @param imageView
     * @param url
     * @param options
     * @param listener
     */
    public void displayImage(ImageView imageView, String url, DisplayImageOptions options, ImageLoadingListener listener){
        if (imageloader != null) {
            imageloader.displayImage(url,imageView,options,listener);
        }
    }

    public void display (ImageView imageView, String url, ImageLoadingListener listener){
        displayImage(imageView, url, null, listener);
    }

    public void display(ImageView imageView,String url){
        display(imageView,url,null);
    }
}
好了,到此封裝已經完成了,直接呼叫即可實現。 例:
      ImageLoaderManager.getInstance(context).displayImage();