Android开源框架Universal-Image-Loader应用

概述

Universal-Image-Loader是一个使用非常广泛的异步加载图片的开源库,目前手中的项目正好是使用这个开源库,为了能更好的应用该开源库的知识点,也让自己能够理解的更加深刻,现在自己写下这篇博客进行总结,记录自己的学习体会;
关于开源库中GitHub路径:https://github.com/nostra13/Android-Universal-Image-Loader

该开源库特点

多线程图片加载
可以广泛定制ImageLoader’s 的配置(例如:线程池,图片下载器,解码器,内存和硬盘的缓存,图片显示选项,等等)
为每个显示图片的调用可自定义选项
支持图片内存缓存和SD卡缓存
监听加载过程

配置说明

1。快速设置
手动加载
下载该开源库jar包,并把它放在你的Andorid工程目录中的libs下。
或者配置Maven依赖

<dependency>
    <groupId>com.nostra13.universalimageloader</groupId>
    <artifactId>universal-image-loader</artifactId>
    <version>1.9.5</version>
</dependency>

或者配置Gradle依赖

compile ‘com.nostra13.universalimageloader:universal-image-loader:1.9.5’

2。Android Manifest

<manifest>
    <!-- Include following permission if you load images from Internet -->
    <uses-permissionandroid:name="android.permission.INTERNET" />
    <!-- Include following permission if you want to cache images on SD card -->
    <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    ...
</manifest>

3。第一次使用ImageLoader之前,必须在Application或者Activity的类中进行初始化配置ImageLoaderConfiguration。
这个ImageLoaderConfiguration是应用中的全局变量,只需设置一次。
你可以使用默认设置:
ImageLoaderConfiguration configuration = ImageLoaderConfiguration.createDefault(this);
或者自行定义参数:
下面是包含了所有的参数配置,你不需要全部配置,只要根据自己的需求配置即可。

// DON'T COPY THIS CODE TO YOUR PROJECT! This is just example of ALL options using.// See the sample project how to use ImageLoader correctly.
File cacheDir =StorageUtils.getCacheDirectory(context);  //缓存文件目录路径
ImageLoaderConfiguration config =new ImageLoaderConfiguration.Builder(context)
        .memoryCacheExtraOptions(480, 800) // default = device screen dimensions  //内存缓存文件最大长宽
        .diskCacheExtraOptions(480, 800, null)  //本地缓存的详细信息
        .taskExecutor(...)
        .taskExecutorForCachedImages(...)
        .threadPoolSize(3) // default 线程池大小
        .threadPriority(Thread.NORM_PRIORITY-2) // default  设置当前线程的优先级
        .tasksProcessingOrder(QueueProcessingType.FIFO) // default
        .denyCacheImageMultipleSizesInMemory()
        .memoryCache(new LruMemoryCache(2*1024*1024)) //可以自定义自己的内存缓存实现
        .memoryCacheSize(2*1024*1024)  //设置内存缓存的大小
        .memoryCacheSizePercentage(13) // default
        .diskCache(new UnlimitedDiskCache(cacheDir)) // default  可以自定义SD卡中的缓存路径
        .diskCacheSize(50*1024*1024)  //设置Sd卡缓存的大小
        .diskCacheFileCount(100)   //设置可以缓存文件的数量
        .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
        .imageDownloader(new BaseImageDownloader(context)) // default
        .imageDecoder(new BaseImageDecoder()) // default
        .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
        .writeDebugLogs()   //记录log
        .build();     //开始

完成配置之后,进行初始化操作,这一步不可忘记,最好在Application启动时调用。

ImageLoader.getInstance().init(configuration);

4。设置图片显示操作DisplayImageOptions
相关参数设置,同样不需要全部进行配置,只需根据项目需求进行配置即可

// DON’T COPY THIS CODE TO YOUR PROJECT! This is just example of ALL options using.
// See the sample project how to use ImageLoader correctly.
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_stub) // resource or drawable 设置图片下载期间显示的图片
.showImageForEmptyUri(R.drawable.ic_empty) // resource or drawable 设置图片URI为空,或错误时显示的图片
.showImageOnFail(R.drawable.ic_error) // resource or drawable 设置图片加载错误时,显示的图片
.resetViewBeforeLoading(false) // default 设置图片加载前是否重置,复位
.delayBeforeLoading(1000) // 下载前延时的时间
.cacheInMemory(false) // default 设置下载的图片是否缓存在内存中
.cacheOnDisk(false) // default 设置下载的图片是否缓存在SD卡中
.preProcessor(…)
.postProcessor(…)
.extraForDownloader(…)
.considerExifParams(false) // default
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片的缩放方式
.bitmapConfig(Bitmap.Config.ARGB_8888) // default 设置图片的解码类型
.decodingOptions(…) //设置图片的解码类型
.displayer(new SimpleBitmapDisplayer()) // default
.handler(new Handler()) // default
.build();

注意:
上面的配置中:
.imageScaleType(ImageScaleType imageScaleType) 是设置图片的缩放方式
缩放的类型包括
ImageScaleType.NONE:图片不会被缩放
ImageScaleType.IN_SAMPLE_POWER_OF_2:图片将降低2倍,知道下一减少步骤使图片更小。
ImageScaleType.EXACTLY:图片将完全按比例缩小到目标大小
ImageScaleType.EXACTLY_STRETCHED:图片将完全缩放到目标大小
ImageScaleType.IN_SAMPLE_INT:图像将被2次采样的整数倍

.displayer(BitmapDisplayer displayer) 是设置图片的显示方式
显示方式displayer:
RoundedBitmapDisplayer(int roundPixels)设置圆角图片
FakeBitmapDisplayer()这个类什么都没做
FadeInBitmapDisplayer(int durationMillis)设置图片渐显的时间
SimpleBitmapDisplayer()正常显示一张图片

5。显示网络图片
下面5种调用方式可以选择。
1。ImageLoader.getInstance().displayImage(uri, imageView);
2。ImageLoader.getInstance().displayImage(uri, imageView, options);
3。ImageLoader.getInstance().displayImage(uri, imageView, listener);
4。ImageLoader.getInstance().displayImage(uri, imageView, options, listener);
5。ImageLoader.getInstance().displayImage(uri, imageView, options, listener, progressListener);
参数说明:
uri:图片的URL地址
imageView:显示图片的ImageView控件
options:DisplayImageOptions 的配置信息
listener:ImageLoadingListener 图片下载情况的监听(下载开始,下载失败,下载完成,下载取消)
progressListener:ImageLoadingProgressListener 图片下载进度监听

第五种调用方式如下:

ImageLoader.getInstance().displayImage(uri, 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) {
                // 下载进度更新

            }
        });

注意事项
1。如果在你的app中使用Universal-Image-Loader后,经常会出现OOM时,
a:在display options 中禁用内存中的缓存cacheInMemory(false) ,如果仍然出现该问题,使用MemoryAnalyzer 检测它。你还可以尝试下面几个步骤;
b:在ImageLoaderConfiguration 中减小线程池的大小配置(.threadPoolSize(…)),建议1~5
c:在display options 使用 .bitmapConfig(Bitmap.Config.RGB_565) ,RGB_565模式消耗的内存要比RGB_8888少两倍。
d:在display options使用 .imageScaleType(ImageScaleType.EXACTLY)
e:在ImageLoaderConfiguration 中使用.diskCacheExtraOptions(480, 320, null)

编写工具类方便调用

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

import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener;

public class ImageLoadUtil {

    /**
     * 设置ImageLoaderConfiguration的全局配置,
     * 该方法使用默认配置,
     * 在继承Application类的onCreate()中调用
     * 
     * @param context
     */
    public static void initDefaultConfig(Context context) {
        ImageLoaderConfiguration configuration = ImageLoaderConfiguration
                .createDefault(context);
        ImageLoader.getInstance().init(configuration);
    }

    /**
     * 设置ImageLoaderConfiguration的全局配置,
     * 该方法使用自定义配置,
     * 在继承Application类的onCreate()中调用
     * 
     * @param context
     */
    public static void initConfig(Context context) {
        // This configuration tuning is custom. You can tune every option, you
        // may tune some of them,
        // or you can create default configuration by
        // ImageLoaderConfiguration.createDefault(this);
        // method.
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
                .threadPriority(Thread.NORM_PRIORITY - 2)
                .denyCacheImageMultipleSizesInMemory()
                .diskCacheFileNameGenerator(new Md5FileNameGenerator())
                .diskCacheSize(50 * 1024 * 1024)// 50 MiB
                .tasksProcessingOrder(QueueProcessingType.LIFO)
                .writeDebugLogs() // Remove for release app
                .build();

        // Initialize ImageLoader with configuration.
        ImageLoader.getInstance().init(config);
    }

    /**
     * 每次在调用ImageLoader.displayImage任务时,应用到该对象。
     * 
     * @param imageOnLoading 图片下载期间显示的图片
     * @param imageForEmptyUri 图片URI为空,或错误时显示的图片
     * @param imageOnFail 图片加载错误时,显示的图片
     * @return
     */
    public static DisplayImageOptions initOptions(int imageOnLoading,
            int imageForEmptyUri, int imageOnFail) {
        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showImageOnLoading(imageOnLoading)
                .showImageForEmptyUri(imageForEmptyUri)
                .showImageOnFail(imageOnFail)
                .cacheInMemory(true)
                .cacheOnDisk(true)
                .considerExifParams(true)
                .bitmapConfig(Bitmap.Config.RGB_565).build();
        return options;
    }

    public static void displayImage(String url, ImageView imageView) {
        ImageLoader.getInstance().displayImage(url, imageView);
    }

    public static void displayImage(String url, ImageView imageView,
            DisplayImageOptions options) {
        ImageLoader.getInstance().displayImage(url, imageView, options);
    }

    public static void displayImage(String url, ImageView imageView,
            ImageLoadingListener listener) {
        ImageLoader.getInstance().displayImage(url, imageView, listener);
    }

    public static void displayImage(String url, ImageView imageView,
            DisplayImageOptions options, ImageLoadingListener listener) {
        ImageLoader.getInstance().displayImage(url, imageView, options,
                listener);
    }

    public static void displayImage(String url, ImageView imageView,
            DisplayImageOptions options, ImageLoadingListener listener,
            ImageLoadingProgressListener progressListener) {
        ImageLoader.getInstance().displayImage(url, imageView, options,
                listener, progressListener);
    }

}

好了,关于Universal-Image-Loader的基本应用讲解就先结束了,下篇将从源码的角度分析该框架的实现。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值