作者 : 韩曙亮

转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50824912

相关地址介绍 :

-- Universal Image Loader 项目 GitHub 官方地址 : https://github.com/nostra13/Android-Universal-Image-Loader .

-- Universal Image Loader 项目完整中文注释版, 已经将所有类都进行了中文注释, 适合源码学习参考 : https://github.com/han1202012/Android-Quick-Develop/tree/master/lib_universal-image-loader ;

一. Universal-Image-Loader 简介

1. 基本功能

基本功能 :

-- 1. 多线程图片加载 (同步|异步)

-- 2. 广泛的 ImageLoader 定制, 线程执行者, 下载, 编码, 内存 和 硬盘 缓存, 图片显示 等配置;

-- 3. 图片展示的可选定制, 图片存储, 缓存切换, 编解码操作, Bitmap 处理和展示;

-- 4. 图片的内存缓存 和 硬盘缓存, 硬盘包括设备的文件系统 或 SD 卡;

-- 5. 监听加载过程, 包括下载过程;

2. 可使用的 URI 地址种类

识别的 URI 地址 :

-- 网络资源 : "http://site.com/image.png" // from Web

-- 本地 SD 卡资源 : "file:///mnt/sdcard/image.png" // from SD card

-- 本地 SD 卡资源 (媒体资源) : "file:///mnt/sdcard/video.mp4" // from SD card (video thumbnail)

-- ContentProvider 图片资源 : "content://media/external/images/media/13" // from content provider

-- ContentProvider 媒体资源 :"content://media/external/video/media/13" // from content provider (video thumbnail)

-- 工程中的 assets 目录 : "assets://image.png" // from assets

-- 工程中的 res 目录 : "drawable://" + R.drawable.img // from drawables (non-9patch images)

3. ImageLoader 简单使用

ImageLoader 简单使用 :

-- 1. 获取 ImageLoader : 获取 ImageLoader 单例实例对象;

ImageLoader imageLoader = ImageLoader.getInstance();

-- 2. 加载图片到 ImageView : 加载图片, 将图片解析成 Bitmap 对象, 并将 Bitmap 设置到 ImageView 中显示, 或者 其它实现了 ImageAware 接口的 View 对象;

imageLoader.displayImage(imageUri, imageView);

-- 3. 异步加载图片 : 加载图片, 将图片解析成 Bitmap 对象, 并在解析完成时返回, 解析返回不是实时同步的;

imageLoader.loadImage(imageUri, new SimpleImageLoadingListener() {
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        // 执行你想要对 Bitmap 对象进行的操作
    }
});

-- 4. 同步加载图片 : 加载图片文件, 将图片文件解析成 Bitmap 对象, 并实时同步返回 Bitmap 对象;

Bitmap bmp = imageLoader.loadImageSync(imageUri);

4. ImageLoader 完整使用

ImageLoader 完整使用 :

-- 1. 加载图片到 ImageView : 加载图片, 将图片解析成 Bitmap 对象, 并将 Bitmap 设置到 ImageView 中显示, 或者 其它实现了 ImageAware 接口的 View 对象;

// 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) {
        ...
    }
});

-- 2. 异步加载图片 : 加载图片, 将图片解析成 Bitmap 对象, 并在解析完成时返回, 解析返回不是实时同步的;

// 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
    }
});

-- 3. 同步加载图片 : 加载图片文件, 将图片文件解析成 Bitmap 对象, 并实时同步返回 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);

5. 使用步骤

(1) 引入库的三种方式

引入 Universal-Image_Loader 库 : 使用以下每种方法都可以;

-- 1. 直接导入 JAR 包 : 下载地址 点击打开链接, 将 jar 包导入到 Android 工程中;

-- 2. Maven 依赖 :

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

-- 3. Gradle 依赖

compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

(2) 添加网络存储权限

Manifest 配置 : 使用本 JAR 包需要添加 网络 和 内存 读写权限;

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

(3) 首次初始化 ImageLoader

初始化 : 首次使用 Universal-Image-Loader 之前需要初始化, 初始化必须在一个 Context 中进行初始化;

-- 初始化方法 : 创建一个 ImageLoaderConfiguration, 并且使用 ImageLoader.getInstance().init() 方法进行初始化;

public class MyActivity extends Activity {
    @Override
    public void onCreate() {
        super.onCreate();

        // Create global configuration and initialize ImageLoader with this config
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
            ...
            .build();
        ImageLoader.getInstance().init(config);
        ...
    }
}

(4) 配置 ImageLoader

ImageLoader 配置简介 :

-- 配置全局性 (配置作用范围) : ImageLoader 的 配置 (ImageLoaderConfiguration) 在应用全局中有效, 你只需要设置它一次.

-- 配置可选性 : 配置中所有的选项都是可选的;

-- 默认配置 : 可以查看 ImageLoaderConfiguration.java 类, 其中的默认值即默认配置;

		/** {@value} */
		public static final int DEFAULT_THREAD_POOL_SIZE = 3;
		/** {@value} */
		public static final int DEFAULT_THREAD_PRIORITY = Thread.NORM_PRIORITY - 2;
		/** {@value} */
		public static final QueueProcessingType DEFAULT_TASK_PROCESSING_TYPE = QueueProcessingType.FIFO;

		private Context context;

		private int maxImageWidthForMemoryCache = 0;
		private int maxImageHeightForMemoryCache = 0;
		private int maxImageWidthForDiskCache = 0;
		private int maxImageHeightForDiskCache = 0;
		private BitmapProcessor processorForDiskCache = null;

		private Executor taskExecutor = null;
		private Executor taskExecutorForCachedImages = null;
		private boolean customExecutor = false;
		private boolean customExecutorForCachedImages = false;

		private int threadPoolSize = DEFAULT_THREAD_POOL_SIZE;
		private int threadPriority = DEFAULT_THREAD_PRIORITY;
		private boolean denyCacheImageMultipleSizesInMemory = false;
		private QueueProcessingType tasksProcessingType = DEFAULT_TASK_PROCESSING_TYPE;

		private int memoryCacheSize = 0;
		private long diskCacheSize = 0;
		private int diskCacheFileCount = 0;

		private MemoryCache memoryCache = null;
		private DiskCache diskCache = null;
		private FileNameGenerator diskCacheFileNameGenerator = null;
		private ImageDownloader downloader = null;
		private ImageDecoder decoder;
		private DisplayImageOptions defaultDisplayImageOptions = null;

		private boolean writeLogs = false;

-- 配置示例 : 所有配置的示例.

// 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
        .diskCacheSize(50 * 1024 * 1024)
        .diskCacheFileCount(100)
        .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
        .imageDownloader(new BaseImageDownloader(context)) // default
        .imageDecoder(new BaseImageDecoder()) // default
        .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
        .writeDebugLogs()
        .build();

(5) 展示选项

展示选项简介 :

-- 作用范围 : 展示选项 (DisplayImageOptions) 只对每个展示任务 (Display Task) 有效 (ImageLoader.displayImage(...));

-- 展示任务 : 展示选项 (Display Options) 可以被应用于每个展示任务 (ImageLoader.displayImage(...) call);

-- 默认展示选项使用条件 : 如果展示选项没有通过 ImageLoader.displayImage(...) 方法设置, 那么就会使用默认的展示选项;

-- 默认展示选项来源 : 展示选项是 配置类 调用 ddefaultDisplayImageOptions() 方法获取,  如ImageLoaderConfiguration.defaultDisplayImageOptions(...) ;

-- 展示选项示例 :

// 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
        .showImageOnFail(R.drawable.ic_error) // resource or drawable
        .resetViewBeforeLoading(false)  // default
        .delayBeforeLoading(1000)
        .cacheInMemory(false) // default
        .cacheOnDisk(false) // default
        .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();

二. Universal-Image-Loader 示例代码

示例代码地址 : https://github.com/han1202012/Android-Quick-Develop/tree/master/app_sample_universal-image-loader

1. ListView 中使用 UIL

ListView 中使用 UIL :

-- 核心代码 : 主要是在 ListView 的适配器中使用 UIL;

-- 设置展示选项 :

			options = new DisplayImageOptions.Builder()
					.showImageOnLoading(R.drawable.ic_stub)		//设置加载时的图片
					.showImageForEmptyUri(R.drawable.ic_empty)	//设置没有 Uri 地址时的图片
					.showImageOnFail(R.drawable.ic_error)		//设置加载失败时的图片
					.cacheInMemory(true)						//设置内存缓存
					.cacheOnDisk(true)							//设置硬盘缓存
					.considerExifParams(true)					//考虑相机参数
					.displayer(new CircleBitmapDisplayer(Color.WHITE, 5))//设置加载器, 将图片切成圆形展示出来
					.build();

-- 调用核心方法展示图片 :

ImageLoader.getInstance().displayImage(IMAGE_URLS[position], holder.image, options, animateFirstListener);

-- 完整的 ListView 适配器代码 :

	private static class ImageAdapter extends BaseAdapter {

		private static final String[] IMAGE_URLS = Constants.IMAGES_CN;

		private LayoutInflater inflater;
		private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();

		private DisplayImageOptions options;

		ImageAdapter(Context context) {
			inflater = LayoutInflater.from(context);

			options = new DisplayImageOptions.Builder()
					.showImageOnLoading(R.drawable.ic_stub)		//设置加载时的图片
					.showImageForEmptyUri(R.drawable.ic_empty)	//设置没有 Uri 地址时的图片
					.showImageOnFail(R.drawable.ic_error)		//设置加载失败时的图片
					.cacheInMemory(true)						//设置内存缓存
					.cacheOnDisk(true)							//设置硬盘缓存
					.considerExifParams(true)					//考虑相机参数
					.displayer(new CircleBitmapDisplayer(Color.WHITE, 5))//设置加载器, 将图片切成圆形展示出来
					.build();
		}

		@Override
		public int getCount() {
			return IMAGE_URLS.length;
		}

		@Override
		public Object getItem(int position) {
			return position;
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(final int position, View convertView, ViewGroup parent) {
			View view = convertView;
			final ViewHolder holder;
			if (convertView == null) {
				view = inflater.inflate(R.layout.item_list_image, parent, false);
				holder = new ViewHolder();
				holder.text = (TextView) view.findViewById(R.id.text);
				holder.image = (ImageView) view.findViewById(R.id.image);
				view.setTag(holder);
			} else {
				holder = (ViewHolder) view.getTag();
			}

			holder.text.setText("Item " + (position + 1));

			//加载 并 显示图片
			ImageLoader.getInstance().displayImage(IMAGE_URLS[position], holder.image, options, animateFirstListener);

			return view;
		}

		static class ViewHolder {
			TextView text;
			ImageView image;
		}
	}

-- 效果图 :

2. GridView中使用 UIL

GridView 中使用 UIL :

-- 核心代码 : 主要是在 GridView 中的适配器中使用 UIL;

-- 设置展示选项 :

		private DisplayImageOptions options;

		options = new DisplayImageOptions.Builder()
					.showImageOnLoading(R.drawable.ic_stub)		//设置加载时显示的图片
					.showImageForEmptyUri(R.drawable.ic_empty)	//设置 Uri 为 空时显示的图片
					.showImageOnFail(R.drawable.ic_error)		//设置加载失败显示的图片
					.cacheInMemory(true)						//设置内存缓存
					.cacheOnDisk(true)							//设置磁盘缓存
					.considerExifParams(true)					//考虑相机参数
					.bitmapConfig(Bitmap.Config.RGB_565)		//设置解码参数
					.build();

-- 设置加载 处理 监听器 : 在加载图片时 可以设置加载监听器;

			//加载 并 显示图片, 设置加载监听器 监听 开始加载 加载失败 加载完成 事件
			ImageLoader.getInstance()
					.displayImage(IMAGE_URLS[position], holder.imageView, options, new SimpleImageLoadingListener() {
						@Override
						public void onLoadingStarted(String imageUri, View view) {
							holder.progressBar.setProgress(0);
							holder.progressBar.setVisibility(View.VISIBLE);
						}

						@Override
						public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
							holder.progressBar.setVisibility(View.GONE);
						}

						@Override
						public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
							holder.progressBar.setVisibility(View.GONE);
						}
					}, new ImageLoadingProgressListener() {
						@Override
						public void onProgressUpdate(String imageUri, View view, int current, int total) {
							holder.progressBar.setProgress(Math.round(100.0f * current / total));
						}
					});

-- 完整的 GridView 适配器代码 :

	private static class ImageAdapter extends BaseAdapter {

		private static final String[] IMAGE_URLS = Constants.IMAGES_CN;

		private LayoutInflater inflater;

		private DisplayImageOptions options;

		ImageAdapter(Context context) {
			inflater = LayoutInflater.from(context);

			options = new DisplayImageOptions.Builder()
					.showImageOnLoading(R.drawable.ic_stub)		//设置加载时显示的图片
					.showImageForEmptyUri(R.drawable.ic_empty)	//设置 Uri 为 空时显示的图片
					.showImageOnFail(R.drawable.ic_error)		//设置加载失败显示的图片
					.cacheInMemory(true)						//设置内存缓存
					.cacheOnDisk(true)							//设置磁盘缓存
					.considerExifParams(true)					//考虑相机参数
					.bitmapConfig(Bitmap.Config.RGB_565)		//设置解码参数
					.build();
		}

		@Override
		public int getCount() {
			return IMAGE_URLS.length;
		}

		@Override
		public Object getItem(int position) {
			return null;
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			final ViewHolder holder;
			View view = convertView;
			if (view == null) {
				view = inflater.inflate(R.layout.item_grid_image, parent, false);
				holder = new ViewHolder();
				assert view != null;
				holder.imageView = (ImageView) view.findViewById(R.id.image);
				holder.progressBar = (ProgressBar) view.findViewById(R.id.progress);
				view.setTag(holder);
			} else {
				holder = (ViewHolder) view.getTag();
			}

			//加载 并 显示图片, 设置加载监听器 监听 开始加载 加载失败 加载完成 事件
			ImageLoader.getInstance()
					.displayImage(IMAGE_URLS[position], holder.imageView, options, new SimpleImageLoadingListener() {
						@Override
						public void onLoadingStarted(String imageUri, View view) {
							holder.progressBar.setProgress(0);
							holder.progressBar.setVisibility(View.VISIBLE);
						}

						@Override
						public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
							holder.progressBar.setVisibility(View.GONE);
						}

						@Override
						public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
							holder.progressBar.setVisibility(View.GONE);
						}
					}, new ImageLoadingProgressListener() {
						@Override
						public void onProgressUpdate(String imageUri, View view, int current, int total) {
							holder.progressBar.setProgress(Math.round(100.0f * current / total));
						}
					});

			return view;
		}

		static class ViewHolder {
			ImageView imageView;
			ProgressBar progressBar;
		}
	}

-- 显示效果 :

作者 : 韩曙亮

转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50824912

【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )的更多相关文章

  1. 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING

    <Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th  2014 Email:skyseraph00@163.com 更多精彩请直接 ...

  2. Android中悬浮窗口的实现原理和示例代码

    用了我一个周末的时间,个中愤懑就不说了,就这个问题,我翻遍全球网络没有一篇像样的资料,现在将实现原理简单叙述如下: 调用WindowManager,并设置WindowManager.LayoutPar ...

  3. Android开源库--Universal Image Loader通用图片加载器

    如果说我比别人看得更远些,那是因为我站在了巨人的肩上.   github地址:https://github.com/nostra13/Android-Universal-Image-Loader 介绍 ...

  4. Android NDK开发篇(六):Java与原生代码通信(异常处理)

    一.捕获异常 异常处理是Java中的功能.在Android中使用SDK进行开发的时候常常要用到.Android原生代码在运行过程中假设遇到错误,须要检測,并抛出异常给Java层.运行原生代码出现了问题 ...

  5. 【Android 应用开发】Activity 状态保存 OnSaveInstanceState參数解析

    作者 : 韩曙亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38297083 一. 相关方法简单介绍 1. 状态保存方法演示 ...

  6. Android NDK开发篇(五):Java与原生代码通信(数据操作)

    尽管说使用NDK能够提高Android程序的运行效率,可是调用起来还是略微有点麻烦.NDK能够直接使用Java的原生数据类型,而引用类型,由于Java的引用类型的实如今NDK被屏蔽了,所以在NDK使用 ...

  7. Android NDK开发篇(四):Java与原生代码通信(原生方法声明与定义与数据类型)

    Java与原生代码通信涉及到原生方法声明与定义.数据类型.引用数据类型操作.NIO操作.訪问域.异常处理.原生线程 1.原生方法声明与定义 关于原生方法的声明与定义在上一篇已经讲一点了,这次具体分析一 ...

  8. 分布式监控系统开发【day38】:报警自动升级代码解析及测试(八)

    一.报警自动升级代码解析 发送邮件代码 def action_email(self,action_obj,action_operation_obj,host_id,trigger_data): ''' ...

  9. SkylineGlobe TEPro 6.6.1 二次开发导出KML或者KMZ文件示例代码

    其实Skyline的fly文件跟kml文件很像很像,只不过一个是编码加密的,另一个早已经成为OGC的通用标准: 喜欢Skyline的小伙伴们试试下面的代码吧,细心的人能发现彩蛋哦. <!DOCT ...

随机推荐

  1. C++11 作用域内枚举

    enum class MyEnum{ P1 = , P2, P3, P4, P5 }; MyEnum myEnum = MyEnum::P2; 使用作用域的方式获取并限定P2的值.之所以要使用作用域, ...

  2. Jmeter启动问题总结

    下载下来的jmeter文件,双击jmeter.bat文件打开的时候,系统提示如下: 查询安装的环境,java的jdk存在,并且版本在1.7以上,详情如下: 在环境变量PATH中添加:%SystemRo ...

  3. mysql之连接查询小作业

    #数据准备drop table if exists class;create table class(    class_no int(2) unsigned zerofill primary key ...

  4. shell实现脚本监控服务器及web应用

    实际工作中我们需要知道部署在服务器上的应用有没有问题,但是人为的操作太麻烦有咩有简单的方式呢shell来监控我们服务器运行状态以及服务器上部署的应用,如果出现异常就会自动发送一个邮件给我们,开始搞起. ...

  5. [ Java学习基础 ] 浅析Java方法调用

     先看一个示例,读者可先自行阅读判断输出结果: public class TestClass { private static void testMethod(){ System.out.printl ...

  6. [HNOI2010]STONE取石头游戏

    题目描述 A 公司正在举办一个智力双人游戏比赛----取石子游戏,游戏的获胜者将会获得 A 公司提供的丰厚奖金,因此吸引了来自全国各地的许多聪明的选手前来参加比赛. 与经典的取石子游戏相比,A公司举办 ...

  7. 【LSGDOJ 1852】青蛙的烦恼 DP

    题目描述 池塘中有n片荷叶恰好围成了一个凸多边形,有一只小青蛙恰好站在1号荷叶上,小青蛙想通过最短的路程遍历所有的荷叶(经过一个荷叶一次且仅一次),小青蛙可以从一片荷叶上跳到另外任意一片荷叶上. 输入 ...

  8. 网络编程基础API

    1.预备知识 网络字节序 1.TCP/IP协议规定,网络数据流应采用大端字节序 0x12345678 小端存储:78存储在低地址 大端存储:12存储在低地址 网络字节序和主机字节序的转换 #inclu ...

  9. hdu 1754 线段树(Max+单点修改)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  10. [poj2451]Uyuw's Concert

    半平面交滴裸题,但是要求nlogn,练练手 #include<iostream> #include<cstdio> #include<cmath> #include ...