转载请标明出处:html
http://blog.csdn.net/developer_jiangqq/article/details/50439814
java
本文出自:【江清清的博客】android
(一).前言:
已经半个月没有更新文章了,一方面是最近工做比较忙,另外一方面我也在选择博客的题材。此次我主要讲解平时用的比较多的图片加载框架ImageLoader。虽然这个框架前不久做者已经中止更新了,不过这个图片加载框架我已经用了好久了。我深知框架使用简即是一方面,可是若是可以不只会使用并且可以深知其中实现的原理才是最重要的。因此我把ImageLoader项目全部的代码阅读了一遍而且给每一个类和相关方法添加了中文版本的注释。git
本例以及UIL框架所有中文版本注释项目已经更新到github,有兴趣你们能够去clone,start或者fork。github
地址https://github.com/jiangqqlmj/Android-Universal-Image-Loader-Modify算法
[顺便说一下,能够微信扫描关注左侧的二维码关注订阅号,获取最新文章哈~]缓存
本次专题的文章主要会涉及到如下部分ImageLoader的介绍和使用,部分重要模块分析以及相关源码讲解。今天咱们主要进行第一部分的讲解(ImageLoader基础介绍和使用讲解)。微信
(二).ImageLoader基本介绍:
咱们在开发APP的时候确定遇到加载图片的需求尤为是列表须要加载大量图片的时候,那么咱们势必须要进行下载图片而且进行显示。可是因为内存等各方面的问题多多少少会遇到一些问题;例如:列表加载图片,图片错乱分布啦。或者出现OOM问题啦~~这时候咱们须要开发图片异步加载而且能够适当压缩框架。例如:UIL(Universal-Image-Loader,github项目地址UIL项目地址)除此以外还有其余不少框架Glide,Fresco,Picasso等等不少。后面几个如今用的比较多并且还在更多。后面的文章我这边也会分享其余的图片加载框架。网络
UIL(Universal-Image-Loader)旨在提供一个强大的、灵活的和高度可定制的工具图像加载、缓存和显示功能。而且提供了许多配置选项和良好控制图像加载和缓存的过程。因此在以前长久的一段时间里,该框架的使用很是广且很方便哦。多线程
UIL框架特色:
- 支持多线程图片加载(同步或者异步)
- 支持自定义配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其余的一些配置
- 支持自定义配置图片显示,例如:缓存开关选择,界面选项,图片加载进度以及显示
- 支持图片内存缓存或者文件系统,设备SD缓存
- 支持图片加载进度监听(包括图片下载进度监听)
- 支持框架更多工具类的扩展
- 一样能够支持例如ListView,GridView进行滑动的时候暂停或者恢复图片加载显示等功能。
- 固然还有其余很过特色,具体你们读了源码就会知道啦….
(三).ImageLoader快速安装:
若是咱们要使用ImageLoader你们均可以项目地址下载一份代码其中会有imageLoader的jar包引入到项目就能够了。总体项目中内容文件夹以下:

3.1.咱们下载imageloader的jar包到咱们项目libs文件夹中,而后关联便可(universal-image-loader-1.9.5.jar):
3.2.如今咱们采用Android Studio开发项目了,咱们只须要build.gradle中添加如下依赖便可:
compile'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
3.3.项目配置文件须要添加相关权限(主要为访问网络权限,若是图片须要sdcard缓存还须要多添加一个权限)
- <manifest>
-
- <uses-permission android:name="android.permission.INTERNET" />
-
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- ...
- </manifest>
3.4.最后咱们须要在第一次使用ImageLoader以前,作一下ImageLoader的基础配置,该项配置能够在application或者activity中作便可,以下方式:
- ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
- ...
- .build();
- ImageLoader.getInstance().init(config);
3.5.下面咱们就能够具体使用ImageLoader来进行加载和显示图片啦。
(四).ImageLoader全局配置项(Configuration)
上面3.4中咱们讲到了ImageLoader在使用以前须要进行全局配置一下。OK,ImageLoader给咱们提供了一个ImageLoaderConfiguration来进行全局设置ImageLoader。不过该设置是全局的,咱们只须要设置一次便可了。
查看ImageLoader文档以及ImageLoaderConfiguration源码发现,该为咱们提供了全部的配置项都是可选的。除非你须要自定义设置,模板咱们能够调用该其中默认构造的方法以下:
ImageLoaderConfiguration configuration=ImageLoaderConfiguration.createDefault(this);
ImageLoader.getInstance().init(configuration);
上面的createDefault方法会给咱们默认初始化一些配置项,具体全部配置可选项以下图:

上面包括设置缓存大小,任务执行器,线程池线程数量,线程权重,任务执行算法,磁盘缓存大小,缓存文件数量,缓存文件命名规则,图片下载器,解码器,图片显示配置项等等。你们能够随意根据项目实际状况配置便可了。
(五).ImageLoader图片Display配置项(Display Options)
上面咱们讲到了ImageLoader的全局配置,在对于图片显示的时候(ImageLoader.displayImage(…)的时候),咱们还能够设置图片显示的参数(主要使用DisplayImageOptions)。Display Options(显示可选项)用于每次图片显示任务的时候(ImageLoader.displayImage()该方法被调用)。
【注意】若是咱们没有设置图片显示配置项,那么我在显示图片的时候会默认调用图片默认显示方式。具体可选配置项以下:

上面包括图片加载过程当中,图片地址为空以及图片加载失败的图片,加载延时,开启内存缓存以及磁盘缓存,图片缩放类型,图片编码类型以及图片显示加载器等等参数。具体根据实际项目选择配置便可。
(六).ImageLoader加载图片讲解
如今咱们开始讲解使用ImageLoader加载图片啦,在这以前你们必定要按照第三点的内容ImageLoader要安装一下以及作一下基本权限以及全局配置哦~下面咱们首先看一下ImageLoader来显示图片的几个方法:

查看上面ImageLoader的方法图看:主要分为下面三种方式加载图片啦~咱们在项目中通常使用前两种哦(displayImage和loadImage),由于这两种是异步的,另外的loadImageSync是同步的啦。
6.1.dispalyImage()方法使用讲解:
6.1.1本例中我ImageLoader全局是采用默认配置的以下:
- public class UILApplication extends Application {
- @Override
- public void onCreate() {
- super.onCreate();
- initImageLoader();
- }
- private void initImageLoader(){
- ImageLoaderConfiguration configuration=ImageLoaderConfiguration.createDefault(this);
- ImageLoader.getInstance().init(configuration);
- }
- }
实例布局文件以下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- androidlayout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:gravity="center">
- <ImageView
- android:id="@+id/test_img_one"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/ic_data_loading"/>
- </LinearLayout>
而后Activitity实例化控件以及ImageLoader,调用displayImage方法便可:
- ImageView test_img_one=(ImageView)this.findViewById(R.id.test_img_one);
- ImageLoader.getInstance().displayImage(ImageDataUtils.ImagesUtils[0],test_img_one);
6.1.2.上边咱们采用displayImage是两个参数的方法,咱们同时能够在这边加入图片显示参数配置以下便可:
- ImageView test_img_one=(ImageView)this.findViewById(R.id.test_img_one);
- DisplayImageOptions options=new DisplayImageOptions.Builder()
- .showImageOnLoading(R.drawable.ic_data_loading)
- .showImageOnFail(R.drawable.ic_data_error)
- .cacheInMemory(true)
- .cacheOnDisk(true)
- .build();
- ImageLoader.getInstance().displayImage(ImageDataUtils.ImagesUtils[1],test_img_one,options);
上面咱们配置加载过程当中和加载失败显示的图片以及开启内存和磁盘缓存功能运行效果以下:

6.1.3.在显示的时候咱们还能够加入图片的目标尺寸,以下:
- ImageSize size=new ImageSize(100,50);
- ImageLoader.getInstance().displayImage(ImageDataUtils.ImagesUtils[1],test_img_one,size);
这边构造一个ImageSize对象来定义目标图片的宽度和高度,传入宽100,高50,运行效果以下:

6.1.4.除了上面的三个显示重载方法以外,咱们还能够传入一个图片加载进度监听器进入,具体接口回调咱们放入到下面loadImage()方法中讲解。
6.2.loadImage()方法使用讲解:
上面6.1咱们已经对displayImage()方法作了一些讲解,如今咱们对于另一个异步加载图片方法loadImage作一下讲解。本例中我这边采用TwoActivity以及一个简单布局:该布局中就放入一个ImageView便可。全局配置和上面同样。
6.2.1.loadImage(Stringuri, ImageLoadingListener listener)
该传入两个参数第一个为图片下载地址,第二个为图片加载监听器首先采用默认的接口以下设置:
- ImageView test_img_two=(ImageView)this.findViewById(R.id.test_img_two);
- ImageLoader.getInstance().loadImage(ImageDataUtils.ImagesUtils[3], new ImageLoadingListener() {
- @Override
- public void onLoadingStarted(String imageUri, View view) {
-
- Log.d("zttjiangqq","onLoadingStarted...");
- }
- @Override
- public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
-
- Log.d("zttjiangqq","onLoadingFailed...");
- }
- @Override
- public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
-
- Log.d("zttjiangqq","onLoadingComplete...");
- test_img_two.setImageBitmap(loadedImage);
- }
- @Override
- public void onLoadingCancelled(String imageUri, View view) {
-
- Log.d("zttjiangqq","onLoadingCancelled...");
- }
- });
具体运行打印的日志和运行结果以下:


咱们看到使用ImageLoadingListener接口必需要实现接口中四个方法,可是咱们平时实际状况下可能不须要回调那么多方法,不错的是UIL给咱们提供了一个类SimpleImageLoadingListener类,该类实现了ImageLoadingListener接口。咱们传入该实现类便可,这样咱们重写实际所需的方法就方便多了。具体实例以下
- ImageLoader.getInstance().loadImage(ImageDataUtils.ImagesUtils[4],new SimpleImageLoadingListener(){
- @Override
- public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
- super.onLoadingComplete(imageUri, view, loadedImage);
-
- Log.d("zttjiangqq","onLoadingComplete...");
- test_img_two.setImageBitmap(loadedImage);
- }
-
- @Override
- public void onLoadingStarted(String imageUri, View view) {
- super.onLoadingStarted(imageUri, view);
-
- Log.d("zttjiangqq", "onLoadingStarted...");
- }
- });
这边我只重写了onLoadingComplete和onLoadingStarted两个方法,代码量上面就减小了不少。
6.2.2.loadImage(Stringuri, ImageSize targetImageSize, DisplayImageOptions options,ImageLoadingListenerlistener)
该加载图片方法6.1中讲得差很少,咱们同时能够传入图片显示配置项,具体示例以下:
- DisplayImageOptions options=new DisplayImageOptions.Builder()
- .showImageOnLoading(R.drawable.ic_data_loading)
- .showImageOnFail(R.drawable.ic_data_error)
- .cacheInMemory(true)
- .cacheOnDisk(true)
- .build();
- ImageLoader.getInstance().loadImage(ImageDataUtils.ImagesUtils[5],options,new SimpleImageLoadingListener(){
- @Override
- public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
- super.onLoadingComplete(imageUri, view, loadedImage);
-
- Log.d("zttjiangqq","onLoadingComplete...");
- test_img_two.setImageBitmap(loadedImage);
- }
- });
6.2.3.loadImage(Stringuri, ImageSize targetImageSize, ImageLoadingListener listener)
该加载图片方式咱们能够传入目标图片的尺寸大小,用起来直接构造一个ImageSize传入进去就能够了。具体方法以下:
- ImageSize size=new ImageSize(100,50);
- ImageLoader.getInstance().loadImage(ImageDataUtils.ImagesUtils[6],size,new SimpleImageLoadingListener(){
- @Override
- public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
- super.onLoadingComplete(imageUri, view, loadedImage);
-
- Log.d("zttjiangqq","onLoadingComplete...");
- test_img_two.setImageBitmap(loadedImage);
- }
- });
6.2.4.主要就是以上几种方式,其余的图片加载方法和以上的差很少,只须要传入对应的参数就能够了。
(七).最后总结
今天咱们对于UIL(Universal-Image-Loader)开源框架的介绍和基本使用作了相关讲解,包括介绍,安装,配置以及基本使用方面。下一讲会着重讲解该开源组件几个核心的类以及相关使用注意事项。
本例以及UIL框架所有中文版本注释项目已经更新到github,有兴趣你们能够去clone,start或者fork。
地址https://github.com/jiangqqlmj/Android-Universal-Image-Loader-Modify
尊重原创,转载请注明:From Sky丶清(http://blog.csdn.net/developer_jiangqq) 侵权必究!