转载请标明出处:
http://blog.csdn.net/developer_jiangqq/article/details/50439814
本文出自:【江清清的博客】
(一).前言:
【好消息】个人站点已经上线执行,后面博客以及技术干货等精彩文章会同步更新。请大家关注收藏:http://www.lcode.org
已经半个月没有更新文章了。一方面是近期工作比較忙,还有一方面我也在选择博客的题材。这次我主要解说平时用的比較多的图片载入框架ImageLoader。尽管这个框架前不久作者已经停止更新了。只是这个图片载入框架我已经用了非常久了。我深知框架使用简便是一方面,可是假设能够不仅会使用而且能够深知当中实现的原理才是最重要的。所以我把ImageLoader项目全部的代码阅读了一遍而且给每一个类和相关方法加入了中文版本号的凝视。
本例以及UIL框架全部中文版本号凝视项目已经更新到github,有兴趣大家能够去clone。start或者fork。
地址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>
<!-- 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.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) 侵权必究!
关注我的订阅号(codedev123),每天分享移动开发技术(Android/IOS),项目管理以及博客文章!(欢迎关注。第一时间推送精彩文章)
关注我的微博,能够获得很多其它精彩内容