图片处理框架之ImageLoader

来源:互联网 发布:淘宝为什么屏蔽神武 编辑:程序博客网 时间:2024/05/23 16:55

一 前言

      刚开始作android项目时使用就是ImageLoader来加载图片的,在其内部自动实现了图片的下载、缓存等功能,自己只需要配置一下缓存路径就可以,当时感觉这已经很牛掰了,现在己经出现了Glide、Picasso等图片处理框架,这些框架使用起来更加方便可靠,不过在很多的老项目中还有很多在使用ImageLoader,在此总结下,开源库:https://github.com/nostra13/Android-Universal-Image-Loader,也可以到我的资源中直接下载Jar包(点击下载ImageLoader)放到项目的libs目录下,然后右键选择Add As Library,
在gradle文件中有如下代码:
compile files('libs/universal-image-loader-1.9.4-with-sources.jar')
说明你添加库成功。

二 配置

      配置ImageLoader需要在启动App的时候就要进行配置,也就是说需要在Application的子类中进行配置,你得自定义一个类继承Application,在该类的onCreate函数中配置ImageLoader,当然该类(Application的子类)必须在AndroidManifest.xml文件中进行注册,如我的是MyApplication,注册如下:
<application
android:name=".MyApplication"
...>
......
</application>
配置代码如下:

@Override
public void onCreate() {
super.onCreate();
initImageLoader(this);
}

public static void initImageLoader(Context context ){
//FileUtil.getAppCacheAbsoluteFile(context) 用来创建缓存文件
DiskCache cache = new UnlimitedDiskCache(FileUtil.getAppCacheAbsoluteFile(context));
//ImageUtil.PATH_USER_IMAGE为文件路径
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.memoryCacheExtraOptions(480, 800) // max width, max height,即保存的每个缓存文件的最大长宽
.threadPoolSize(3) //线程池内线程的数量
.threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.diskCacheFileNameGenerator(new Md5FileNameGenerator()) //将保存的时候的URI名称用MD5 加密
.memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))
.memoryCacheSize(2 * 1024 * 1024) // 内存缓存的最大值
.diskCacheSize(50 * 1024 * 1024) // SD卡缓存的最大值
.tasksProcessingOrder(QueueProcessingType.LIFO)
// 由原先的discCache -> diskCache
.diskCache(cache)//自定义缓存路径
.imageDownloader(new BaseImageDownloader(context, 5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超时时间
.writeDebugLogs() // Remove for release app
.build();
//全局初始化此配置
ImageLoader.getInstance().init(config);
}

三 加载图片

1 直接加载
ImageLoader.getInstance().displayImage("http://img2.pconline.com.cn/pconline/0706/19/1038447_34.jpg",imageView3);
2 设置占位图和加载失败的图片

DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.showImageOnFail(R.mipmap.ic_launcher)
.showImageOnLoading(R.mipmap.ic_launcher)
.build();
ImageLoader.getInstance().displayImage("http://img2.pconline.com.cn/pconline/0706/19/1038447_34.jpg"
,imageView3,displayImageOptions);
3 设置监听
   ImageLoader提供了监视器,可以对图片加载的过程进行监听
ImageLoader.getInstance().displayImage("http://img2.pconline.com.cn/pconline/0706/19/1038447_34.jpg"
, imageView3, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String s, View view) {
//开始下载图片
}

@Override
public void onLoadingFailed(String s, View view, FailReason failReason) {
//下载失败
}

@Override
public void onLoadingComplete(String s, View view, Bitmap bitmap) {
//下载完成

}

@Override
public void onLoadingCancelled(String s, View view) {
//下载失败

}
});
说明,同时ImageLoader也提loaderImage用来加载图片,如下:
public void loadImage(String uri, ImageLoadingListener listener) {
this.loadImage(uri, (ImageSize)null, (DisplayImageOptions)null, listener, (ImageLoadingProgressListener)null);
}

public void loadImage(String uri, ImageSize targetImageSize, ImageLoadingListener listener) {
this.loadImage(uri, targetImageSize, (DisplayImageOptions)null, listener, (ImageLoadingProgressListener)null);
}

public void loadImage(String uri, DisplayImageOptions options, ImageLoadingListener listener) {
this.loadImage(uri, (ImageSize)null, options, listener, (ImageLoadingProgressListener)null);
}

public void loadImage(String uri, ImageSize targetImageSize, DisplayImageOptions options, ImageLoadingListener listener) {
this.loadImage(uri, targetImageSize, options, listener, (ImageLoadingProgressListener)null);
}

public void loadImage(String uri, ImageSize targetImageSize, DisplayImageOptions options, ImageLoadingListener listener, ImageLoadingProgressListener progressListener) {
this.checkConfiguration();
if(targetImageSize == null) {
targetImageSize = this.configuration.getMaxImageSize();
}

if(options == null) {
options = this.configuration.defaultDisplayImageOptions;
}

NonViewAware imageAware = new NonViewAware(uri, targetImageSize, ViewScaleType.CROP);
this.displayImage(uri, (ImageAware)imageAware, options, listener, progressListener);
}
从上面可以看出这就要你自己去处理结果了,当然Image Loader也可以从本地、assets、drawable、content加载图片,如下:
本地:
/**
* 从内存卡中异步加载本地图片
*
* @param uri 图片的绝对路径
* @param imageView 需要显示图片的ImageView对象
* @param options 显示配置
*/
public void displayFromSDCard(String uri, ImageView imageView , DisplayImageOptions options ) {
ImageLoader.getInstance().displayImage("file://" + uri, imageView, options);
}
assets:
public void dispalyFromAssets(String imageName, ImageView imageView ,DisplayImageOptions options) {
// String imageUri = "assets://image.png"; // from assets
ImageLoader.getInstance().displayImage("assets://" + imageName, imageView ,options);
}
drawable:
public void displayFromDrawable(int imageId, ImageView imageView ,DisplayImageOptions options) {
// String imageUri = "drawable://" + R.drawable.image; // from drawables
// (only images, non-9patch)
ImageLoader.getInstance().displayImage("drawable://" + imageId, imageView, options);
}
content:
public void displayFromContent(String uri, ImageView imageView,DisplayImageOptions options) {
ImageLoader.getInstance().displayImage("content://" + uri, imageView, options);
}
我把这些常用的方法放到工具类ImageLoaderUtil(代码点击查看)中。





原创粉丝点击