Android开源框架之Android-Universal-Image-Loader

时间:2021-09-28 20:40:05

引言

图片加载在Android开发中几乎是每一个应用都有的需求。图片加载从大的角度可以分为两种,一种是加载一两张的少量图片,比如用户资料页面加载一个用户头像图片;另一种则是加载大量网络图片,比如朋友圈,比如今日头条等新闻类APP的新闻页。对于第一种情况,我们一般开个线程或者用AsynTask异步加载一下就完事了,但对于第二种如果每张图片的加载都手动new 一个thread去做,逻辑操作复杂和内存泄漏都有可能发生了。

所以针对第二种情况,我们需要“特殊对待”,采用线程池技术来做。而这一点,github上已经有很多优秀的开源框架可供我们使用。比较出名的有Android-Universal-Image-Loader,Picasso,Fresco,Glide等。而其中Android-Universal-Image-Loader在缓存方面和性能方面都很不错,到目前为止几乎是Android最流行的图片加载框架(Picasso党和Glide党请绕路。。。哈哈,其实这几个框架各有优劣,我都很欣赏,仁者见仁吧)

下载链接:Android-Universal-Image-Loader

Android开源框架之Android-Universal-Image-Loader

作用与优势

1、多线程异步加载和显示图片(网络图片、sd卡、资源文件(asset,mipmap等,不能加载9patch),新增加载视频缩略图)
2、支持加载过程的监听,可以暂停加载图片,在经常使用的ListView、GridView中,可以设置滑动时暂停加载,停止滑动时加载图片(便于节约流量,在一些优化中可以使用)
3、高度可定制化(可以根据自己的需求进行各种配置,如:线程池,图片下载器,内存缓存策略等)
4、支持图片的内存缓存,SD卡(文件)缓存

执行原理

在谈论如何使用该框架之前,我们先简单了解其大概的执行原理

UIL的执行原理是使用了三层的缓存结构,从其官方文档可以看到:
Android开源框架之Android-Universal-Image-Loader

也就是分为了有图片在内存缓存中,有图片在本地缓存中和没有图片在本地中三种情况。这种机制可以更快的将图片显示出来并且节省用户网络流量。

使用方法

第一步:导入类库
使用第三方框架的第一步当然是导入框架的jar包。有两种方法:

  • 手动下载jar包,下载地址:Download JAR

  • gradle配置:在gradle的dependency中配置:

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

第二步:在manifest文件中添加图片加载所需要的相关权限,一般为访问网络的权限和访问内存的权限。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

第三步:配置ImageLoaderConfiguration这个类实现全局ImageLoader的一些基本信息设置。(一般在Application中初始化设置该类。)

Android开源框架之Android-Universal-Image-Loader

如图: 这里面的主要设置有:

  • .memoryCacheExtraOptions(480, 800) // max width, max height,即保存的每个缓存文件的最大长度
  • .threadPoolSize(3) //线程池内线程的数量(一般设置为1-5,不要太多,否则会造成性能问题)
  • .memoryCacheSize(2 * 1024 * 1024) // 内存缓存的
  • .diskCacheSize(50 * 1024 * 1024) // SD卡缓存的最大值
  • .diskCache(new UnlimitedDiskCache(cacheDir))//自定义缓存路径
  • 此外还有一些诸如加密算法MD5的设置等等。并不是所有都需要,视自己的项目而定。

配置好ImageLoaderConfiguration后,调用以下方法来实现初始化

ImageLoader.getInstance().init(config);

第四步:实例化ImageLoader,并做图片加载的一些设置(options)。

imageLoader = ImageLoader.getInstance();
imageLoader.init(ImageLoaderConfiguration.createDefault(this));
imageOptions=new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.icon_loading) // 设置图片下载期间显示的图片
.showImageForEmptyUri(R.drawable.icon_url_error) // 设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.drawable.icon_load_error) // 设置图片加载或解码过程中发生错误显示的
.cacheInMemory(true) // 设置下载的图片是否缓存在内存中 .cacheOnDisk(true) // 设置下载的图片是否缓存在SD卡中
.build(); // 构建完成

除了上面代码中的之外,还有一些options里面的常用配置方法。
imageScaleType(ImageScaleType imageScaleType)是设置图片的缩放方式,其中缩放方式有如下几种:
EXACTLY :图像将完全按比例缩小的目标大小
EXACTLY_STRETCHED:图片会缩放到目标大小完全
IN_SAMPLE_INT:图像将被二次采样的整数倍
IN_SAMPLE_POWER_OF_2:图片将降低2倍,直到下一减少步骤,使图像更小的目标大小
NONE:图片不会调整
displayer(BitmapDisplayer displayer)是设置图片的显示方式
显示方式displayer:
RoundedBitmapDisplayer(introundPixels)设置圆角图片
FadeInBitmapDisplayer(intdurationMillis)设置图片渐显的时间
SimpleBitmapDisplayer()正常显示一张图片

第五步:ImageLoader加载显示图片。
这里要分几种情况:

  • 加载一张网络图片

ImageLoader.getInstance().displayImage(imageUrl, imageView);
  • 加载一张网络图片并自定义配置

 imageLoader.displayImage(String url,Imageview iv,imageOptions options);
  • 加载一张图片并对图片的加载过程进行监听

ImageLoader.getInstance().displayImage("http://xxxxx.jpg",mImageView2,mOptions, newImageLoadingListener() {
@Override
public voidonLoadingStarted(String imageUri,View view) {
//开始加载
}
@Override
public voidonLoadingFailed(String imageUri,View view,FailReason failReason) {
//加载失败
}
@Override
public voidonLoadingComplete(String imageUri,View view,Bitmap loadedImage) {
//加载完成
}
@Override
public voidonLoadingCancelled(String imageUri,View view) {
//取消加载
}
});
  • 图片加载时候,带监听又带加载进度条的情况调用

imageLoader.displayImage(imageUrl, imageView, options,newImageLoadingListener() {
@Override
publicvoidonLoadingStarted() {
//开始加载的时候执行
}
@Override
publicvoidonLoadingFailed(FailReason failReason) {
//加载失败的时候执行
}
@Override
publicvoidonLoadingComplete(Bitmap loadedImage) {
//加载成功的时候执行
}
@Override
publicvoidonLoadingCancelled() {
//加载取消的时候执行
},newImageLoadingProgressListener() {
@Override
publicvoidonProgressUpdate(String imageUri, View view,intcurrent,inttotal) {
//在这里更新 ProgressBar的进度信息
}
});

最后

通过这篇文章,相信如果认真读了就能快速入门和学会了Android-Universal-Image-Loader的基础使用。*希望对大家有帮助,如有问题欢迎评论。也希望路过的同学点个赞鼓励一下哦!*