概述
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的基本应用讲解就先结束了,下篇将从源码的角度分析该框架的实现。