Android——universal-imageloader开源库的使用

该开源库是一个用于图像加载处理的项目,项目的下载地址为:
https://github.com/nostra13/Android-Universal-Image-Loader

该库的特征有:

  • 多线程图片加载(异步或者同步)
  • 高度定制图片加载的相关配置(例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置)
  • 支持图片的内存缓存,文件系统缓存或者SD卡缓存
  • 可以监听加载的过程(包括下载过程)

下面开始简单讲介绍该库的使用:
1.首先在上面提供的地址中下载库文件
2.在android studio的项目中导入jar包:我下载下来的文件有三个jar包分别是,universal-image-loader-1.9.5.jar,universal-image-loader-1.9.5-javadoc.jar,universal-image-loader-1.9.5-sources.jar,只需要导入第一个universal-image-loader-1.9.5.jar包。
3.在项目启动的时候初始化ImageLoader的配置。在这里编写了一个BaseApplication 继承自Application。在onCreate()函数中初始化ImageLoader相关配置:、

//在oncreate函数中调用
 Context context=getApplicationContext();
 init(context);

//init函数
public void init(Context context){
        //设置缓存的目录
        File cacheDir= StorageUtils.getOwnCacheDirectory(context,"imageLoader/Cache");
        ImageLoaderConfiguration configuration=new ImageLoaderConfiguration.Builder(context)
                .memoryCacheExtraOptions(400,400)//保存为文件的最大宽高
                .threadPoolSize(3)//线程池加载数
                .threadPriority(Thread.NORM_PRIORITY-2)//设置线程的优先级
                .denyCacheImageMultipleSizesInMemory()//不缓存不同大小的同一图像
                .memoryCache(new UsingFreqLimitedMemoryCache(2*1024*1024))//缓存的最大字节
                // .memoryCacheSize(2*1024*1024)
                .diskCacheSize(50*1024*1024)
                .diskCacheFileNameGenerator(new HashCodeFileNameGenerator())//保存文件名用hash加密
                // .diskCacheFileNameGenerator(new Md5FileNameGenerator())//用MD5加密
                .tasksProcessingOrder(QueueProcessingType.LIFO)
                .diskCacheFileCount(50)//缓存文件数
                .diskCache(new UnlimitedDiskCache(cacheDir))
                .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
                .imageDownloader(new BaseImageDownloader(context,5*1000,30*1000))//设置连接超时时间和加载超时时间
                .writeDebugLogs()
                .build();//构建
        ImageLoader.getInstance().init(configuration);//为ImageLoader初始化配置
    }

4.开始使用ImageLoader,单例初始化的方式,然后使用ImageLoader进行图片显示:

ImageLoader imageLoader=ImageLoader.getInstance();

在调用imageLoader.displayImage()函数显示图片时,先要对显示参数进行设置,我使用了一个DisplayImageOptionsUtil类进行了封装:

public class DisplayImageOptionsUtil {
    private static DisplayImageOptionsUtil util;
    private DisplayImageOptions.Builder builder;

    private DisplayImageOptionsUtil() {
        builder = new DisplayImageOptions.Builder();
        builder.cacheInMemory(true);//设置图片是否缓存在内存中
        builder.cacheOnDisk(true);//设置图片是否缓存在SD上
        builder.considerExifParams(true);//是否考虑图片Exif参数

        /**imageScaleType: *EXACTLY :图像将完全按比例缩小的目标大小 *EXACTLY_STRETCHED:图片会缩放到目标大小完全 *IN_SAMPLE_INT:图像将被二次采样的整数倍 *IN_SAMPLE_POWER_OF_2:图片将降低2倍,直到下一减少步骤,使图像更小的目标大小 *NONE:图片不会调整 */
        builder.imageScaleType(ImageScaleType.EXACTLY_STRETCHED);


        builder.bitmapConfig(Bitmap.Config.RGB_565);//设置图片解码类型
        builder.resetViewBeforeLoading(true);//设置图片加载前重置


        /**displayer(BitmapDisplay display) *RoundedBitmapDisplayer(int roundPixels)设置圆角图片 *FakeBitmapDisplayer()这个类什么都没做 *FadeInBitmapDisplayer(int durationMillis)设置图片渐显的时间 *SimpleBitmapDisplayer()正常显示一张图片 */
        builder.displayer(new FadeInBitmapDisplayer(100));
    }

    public static DisplayImageOptionsUtil getInstance() {
        if (util == null)
            util = new DisplayImageOptionsUtil();
        return util;
    }

    public DisplayImageOptions getDisplayImageOptions() {
        return builder.build();
    }

    /** * 设置加载前显示的图片 * @param resId * @return this */
    public DisplayImageOptionsUtil showImageOnLoading(int resId) {
        if (resId > 0) builder.showImageOnLoading(resId);
        return this;
    }

    /** * 设置加载前显示的图片 * @param drawable * @return this */
    public DisplayImageOptionsUtil showImageOnLoading(Drawable drawable) {
        if (drawable != null) builder.showImageOnLoading(drawable);
        return this;
    }

    /** * 设置图像uri为空或者错误时显示的图片 * @param resId * @return this */
    public DisplayImageOptionsUtil showImageForEmptyUri(int resId) {
        if (resId > 0) builder.showImageForEmptyUri(resId);
        return this;
    }

    /** * 设置图像uri为空或者错误时显示的图片 * @param drawable * @return this */
    public DisplayImageOptionsUtil showImageForEmptyUri(Drawable drawable) {
        if (drawable != null) builder.showImageForEmptyUri(drawable);
        return this;
    }

    /** * 设置图片加载/解码出错显示的图片 * @param resId * @return this */
    public DisplayImageOptionsUtil showImageOnFail(int resId) {
        if (resId > 0) builder.showImageOnFail(resId);
        return this;
    }

    /** * 设置图片加载/解码出错显示的图片 * @param drawable * @return this */
    public DisplayImageOptionsUtil showImageOnFail(Drawable drawable) {
        if (drawable != null) builder.showImageOnFail(drawable);
        return this;
    }
}

最后就可以使用imageLoader.displayImage进行图片加载显示

DisplayImageOptionsUtil util = DisplayImageOptionsUtil.getInstance();
util.showImageOnLoading(R.drawable.img_loading);
util.showImageForEmptyUri(R.drawable.img_loading_uri_err);
util.showImageOnFail(R.drawable.img_loading_fail);
imageLoader.displayImage(url,imageView, util.getDisplayImageOptions());

ImageLoader的displayImage方法有多种重载方式
1.使用默认配置显示,传递一个uri和用于显示图片的控件
public void displayImage(String uri, ImageView imageView) {}
2.加载自定义配置显示图片,也就是上面介绍的基本使用方法
public void displayImage(String uri, ImageView imageView, DisplayImageOptions options) {}
3.带加载状态监听的方法
public void displayImage(String uri, ImageAware imageAware, DisplayImageOptions options,ImageLoadingListener listener) {}
其中要实现ImageLoadingListener的这几个方法:

    @Override  
    public void onLoadingStarted() {  
       //开始加载的时候执行 
    }  
    @Override  
    public void onLoadingFailed(FailReason failReason) {        
       //加载失败的时候执行 
    }   
    @Override   
    public void onLoadingComplete(Bitmap loadedImage) {  
       //加载成功的时候执行 
    }   
    @Override   
    public void onLoadingCancelled() {  
       //加载取消的时候执行 

    }

4.加载状态监听以及加载进度监听
public void loadImage(String uri, ImageSize targetImageSize, DisplayImageOptions options,
ImageLoadingListener listener, ImageLoadingProgressListener progressListener) {}

ImageLoadingProgressListener需要实现的方法:

 @Override  
      public void onProgressUpdate(String imageUri, View view, int current,int total) {     
      //在这里更新 ProgressBar的进度信息 
      }  

关于Uri的写法:
网络图片:String uri=”http://…”
本地文件:String uri=“file://…”,可通过Environment.getExternalStorageDirectory()函数取得根目录
assets资源文件:String uri=”assets://…”
Drawable资源文件:String uri=”drawable://…

你可能感兴趣的:(android)