Android-Universal-Image-Loader是一个非常强大的开源的图片异步加载库,提供一个可重复使用的仪器为异步图像加载,缓存和显示,而且使用也非常简单。使用它我们可以少考虑加载图片遇到的多线程,缓存,内存溢出等很多方面的问题。国内外很多有名的应用程序都有使用,在该类库的默认缓存文件夹中甚至发现了google, instagram, qq, baidu都有在用。
Android-Universal-Image-Loader的代码托管在GitHub上:https://github.com/nostra13/Android-Universal-Image-Loader
本文已同步到个人对立域名博客:http://www.fengchaokm.com/
多线程的图像加载
尽可能多的配置选项(线程池,加载器,解析器,内存/磁盘缓存,显示参数等等)
图片可以缓存在内存中,或者设备文件目录下,或者SD卡中
可以添加图片加载监听器
可以自定义显示每一张图片时都带不同参数
支持Widget
Android 1.5以上支持
1.9.4+版本添加了一个新的API:DisplayImageOptions.targetSize(ImageSize),提供可设置图片的大小。
通过网络加载图片涉及到网络请求权限
<uses-permission android:name="android.permission.INTERNET" />
缓存设置需要设置权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
"http://site.com/image.png" // from Web 从网络获取
"file:///mnt/sdcard/image.png" // from SD card 从SD卡获取
"file:///mnt/sdcard/video.mp4" // from SD card (video thumbnail)
"content://media/external/images/media/13"//from content provider 从内容提供器获取
"content://media/external/video/media/13" // from content provider (video thumbnail)
"assets://image.png" // from assets 从assets目录获取
"drawable://" + R.drawable.img // from drawables (non-9patch images)
3、MyApplication class
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
File cacheDir = StorageUtils.getCacheDirectory(getApplicationContext());
Environment.getExternalStorageDirectory().getPath());
//ImageLoaderConfiguration
所有的选项都是可选的,只选择你真正想制定的去配置
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
getApplicationContext())
// 如果图片尺寸大于了这个参数,那么就会这按照这个参数对图片大小进行限制并缓存
.memoryCacheExtraOptions(480, 800)
.taskExecutor(AsyncTask.sExecutor)
.taskExecutorForCachedImages(AsyncTask.sExecutor)
.threadPoolSize(5)
.threadPriority(Thread.NORM_PRIORITY-2)
.threadPriority(Thread.NORM_PRIORITY - 1)
.tasksProcessingOrder(QueueProcessingType.FIFO)
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new LruMemoryCache(2 * 1024 * 1024))
.memoryCacheSize(2 * 1024 * 1024)
.diskCache(new UnlimitedDiscCache(cacheDir))
.diskCacheSize(50 * 1024 * 1024)
.diskCacheFileCount(100)
.writeDebugLogs()
.build();
ImageLoader.getInstance().init(config);
}
}
Display Options
显示参数可以分别被每一个显示任务调用(ImageLoader.displayImage(…))
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.ic_stub) // 在显示真正的图片前,会加载这个资源
.showImageForEmptyUri(R.drawable.ic_empty) //空的Url时
.showImageOnFail(R.drawable.ic_error)
.resetViewBeforeLoading() //
.delayBeforeLoading(1000) // 延长1000ms 加载图片 (想不出来用在什么场景下)
.cacheInMemory()
.cacheOnDisc()
.preProcessor(...)
.postProcessor(...)
.extraForDownloader(...) //可以向加载器携带一些参数
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default
.bitmapConfig(Bitmap.Config.ARGB_8888) // default
.decodingOptions(...)
.displayer(new SimpleBitmapDisplayer()) // default
.handler(new Handler()) // default
.build();
简单实例
//无回调方法
imageLoader.displayImage(imageUri, imageView);
// 有回调方法
imageLoader.loadImage(imageUri, new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
// Do whatever you want with Bitmap
}
});
// 返回Bitmap对象
Bitmap bmp = imageLoader.loadImageSync(imageUri);
完整版
// Load image, decode it to Bitmap and display Bitmap in ImageView (or any other view
// which implements ImageAware interface)
imageLoader.displayImage(imageUri, 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) {
...
}
});
// Load image, decode it to Bitmap and return Bitmap to callback
ImageSize targetSize = new ImageSize(80, 50); // result Bitmap will be fit to this size
imageLoader.loadImage(imageUri, targetSize, options, new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
// Do whatever you want with Bitmap
}
});
// Load image, decode it to Bitmap and return Bitmap synchronously
ImageSize targetSize = new ImageSize(80, 50); // result Bitmap will be fit to this size
Bitmap bmp = imageLoader.loadImageSync(imageUri, targetSize, options);
欢迎大家关注我的个人微信公众号AndroidSharer,分享软件开发相关技术包括Android、Java Web、HTML5以及产品研发干货,偶尔喝点鸡汤