Universal-Image-Loader 使用

转载 2015年11月18日 17:23:49

项目介绍:

Android上最让人头疼的莫过于从网络获取图片、显示、回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你。Universal Image Loader for Android的目的是为了实现异步的网络图片加载、缓存及显示,支持多线程异步加载。它最初来源于Fedor Vlasov的项目,且自此之后,经过大规模的重构和改进。

特性列举:

多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等
支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置
支持图片的内存缓存,文件系统缓存或者SD卡缓存
支持图片下载过程的监听
根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存
较好的控制图片的加载过程,例如暂停图片加载,重新开始加载图片,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片
提供在较慢的网络下对图片进行加载
使用过程:

创建默认的ImageLoader,所有的操作都由ImageLoader控制。该类使用单例设计模式,所以如果要获取该类的实力,需要调用getInstance()方法。在使用ImageLoader显示图片之前,你首先要初始化它的配置,调用ImageLoaderConfiguration的init()方法,然后你就可以实现各种的显示了。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
//创建默认的ImageLoader配置参数
ImageLoaderConfiguration configuration = ImageLoaderConfiguration
.createDefault(this);
//Initialize ImageLoader with configuration.
ImageLoader.getInstance().init(configuration);

自定义配置imageloader, 就像你已经知道的,首先,你需要使用ImageLoaderConfiguration对象来初始化ImageLoader。由于ImageLoader是单例,所以在程序开始的时候只需要初始化一次就好了。建议你在Activity的onCreate()方法中初始化。如果一个ImageLoader已经初始化过,再次初始化不会有任何效果。下面我们通过ImageLoaderConfiguration.Builder创建一个设置

[java] view plaincopy在CODE上查看代码片派生到我的代码片
File cacheDir =StorageUtils.getOwnCacheDirectory(this, “imageloader/Cache”);
ImageLoaderConfigurationconfig = new ImageLoaderConfiguration
.Builder(this)
.memoryCacheExtraOptions(480, 800) // maxwidth, max height,即保存的每个缓存文件的最大长宽
.threadPoolSize(3)//线程池内加载的数量
.threadPriority(Thread.NORM_PRIORITY -2)
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new UsingFreqLimitedMemoryCache(2* 1024 * 1024)) // You can pass your own memory cache implementation/你可以通过自己的内存缓存实现
.memoryCacheSize(2 * 1024 * 1024)
.discCacheSize(50 * 1024 * 1024)
.discCacheFileNameGenerator(newMd5FileNameGenerator())//将保存的时候的URI名称用MD5 加密
.tasksProcessingOrder(QueueProcessingType.LIFO)
.discCacheFileCount(100) //缓存的文件数量
.discCache(new UnlimitedDiscCache(cacheDir))//自定义缓存路径
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())
.imageDownloader(new BaseImageDownloader(this,5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超时时间
.writeDebugLogs() // Remove for releaseapp
.build();//开始构建
ImageLoader.getInstance().init(config);

得到imageLoader

[java] view plaincopy在CODE上查看代码片派生到我的代码片
ImageLoader imageLoader imageLoader = ImageLoader.getInstance();

使用过程:

(1)图像操作是否参与缓存以及图像效果的配置操作

[java] view plaincopy在CODE上查看代码片派生到我的代码片
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_stub) //加载图片时的图片
.showImageForEmptyUri(R.drawable.ic_empty) //没有图片资源时的默认图片
.showImageOnFail(R.drawable.ic_error) //加载失败时的图片
.cacheInMemory(true) //启用内存缓存
.cacheOnDisk(true) //启用外存缓存
.considerExifParams(true) //启用EXIF和JPEG图像格式
.displayer(new RoundedBitmapDisplayer(20)) //设置显示风格这里是圆角矩形
.build();

DisplayImageOptions以下是所有默认配置参数根据需求可以自定义配置

[java] view plaincopy在CODE上查看代码片派生到我的代码片
private int imageResOnLoading = 0;
private int imageResForEmptyUri = 0;
private int imageResOnFail = 0;
private Drawable imageOnLoading = null;
private Drawable imageForEmptyUri = null;
private Drawable imageOnFail = null;
private boolean resetViewBeforeLoading = false;
private boolean cacheInMemory = false;
private boolean cacheOnDisk = false;
private ImageScaleType imageScaleType = ImageScaleType.IN_SAMPLE_POWER_OF_2;
private Options decodingOptions = new Options();
private int delayBeforeLoading = 0;
private boolean considerExifParams = false;
private Object extraForDownloader = null;
private BitmapProcessor preProcessor = null;
private BitmapProcessor postProcessor = null;
private BitmapDisplayer displayer = DefaultConfigurationFactory.createBitmapDisplayer();
private Handler handler = null;
private boolean isSyncLoading = false;

(2)图片加载监听器在这里吧可以设置加载时的动画或者进度条之类的东西这里

[java] view plaincopy在CODE上查看代码片派生到我的代码片
ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();
private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {
static final List displayedImages = Collections.synchronizedList(new LinkedList());
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
if (loadedImage != null) {
ImageView imageView = (ImageView) view;
boolean firstDisplay = !displayedImages.contains(imageUri);
if (firstDisplay) {
FadeInBitmapDisplayer.animate(imageView, 500);
displayedImages.add(imageUri);
}
}
}
}

(3)简单设置就可以给ImageView添加图片了

[java] view plaincopy在CODE上查看代码片派生到我的代码片
imageLoader.displayImage(imageUrl, imageview, options, animateFirstListener);

对于本地的图片 ,在其绝对地址前面要加入”file://”。网络图片就直接写路径了。

由于我的这个是最新的包,可能跟以前老的版本不同,看到有些网友说的是:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
String imageUri = “http://site.com/image.png“; // 网络图片
String imageUri = “file:///mnt/sdcard/image.png”; //SD卡图片
String imageUri = “content://media/external/audio/albumart/13”; // 媒体文件夹
String imageUri = “assets://image.png”; // assets
String imageUri = “drawable://” + R.drawable.image; // drawable文件

缓存的清理:

   缓存的清理可以按需求来定,可以再每个Activity的生命周期函数onDestroy中清理也可以单独设置让用户自行清理。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
@Override
public void onDestroy() {
super.onDestroy();
imageLoader.clearMemoryCache();
imageLoader.clearDiskCache();
}

GirdView,ListView加载图片:

相信大部分人都是使用GridView,ListView来显示大量的图片,而当我们快速滑动GridView,ListView,我们希望能停止图片的加载,而在GridView,ListView停止滑动的时候加载当前界面的图片,这个框架当然也提供这个功能,使用起来也很简单,它提供了PauseOnScrollListener这个类来控制ListView,GridView滑动过程中停止去加载图片,该类使用的是代理模式

[java] view plaincopy在CODE上查看代码片派生到我的代码片
listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
gridView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));

第一个参数就是我们的图片加载对象ImageLoader, 第二个是控制是否在滑动过程中暂停加载图片,如果需要暂停传true就行了,第三个参数控制猛的滑动界面的时候图片是否加载

OutOfMemoryError:

虽然这个框架有很好的缓存机制,有效的避免了OOM的产生,一般的情况下产生OOM的概率比较小,但是并不能保证OutOfMemoryError永远不发生,这个框架对于OutOfMemoryError做了简单的catch,保证我们的程序遇到OOM而不被crash掉,但是如果我们使用该框架经常发生OOM,我们应该怎么去改善呢?

减少线程池中线程的个数,在ImageLoaderConfiguration中的(.threadPoolSize)中配置,推荐配置1-5

在DisplayImageOptions选项中配置bitmapConfig为Bitmap.Config.RGB_565,因为默认是ARGB_8888, 使用RGB_565会比使用ARGB_8888少消耗2倍的内存

在ImageLoaderConfiguration中配置图片的内存缓存为memoryCache(newWeakMemoryCache()) 或者不使用内存缓存

在DisplayImageOptions选项中设置.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者imageScaleType(ImageScaleType.EXACTLY)

通过上面这些,相信大家对Universal-Image-Loader框架的使用已经非常的了解了,我们在使用该框架的时候尽量的使用displayImage()方法去加载图片,loadImage()是将图片对象回调到ImageLoadingListener接口的onLoadingComplete()方法中,需要我们手动去设置到ImageView上面,displayImage()方法中,对ImageView对象使用的是Weak references,方便垃圾回收器回收ImageView对象,如果我们要加载固定大小的图片的时候,使用loadImage()方法需要传递一个ImageSize对象,而displayImage()方法会根据ImageView对象的测量值,或者android:layout_width and android:layout_height设定的值,或者android:maxWidth and/or android:maxHeight设定的值来裁剪图片

Convert an UNSIGNED byte to a JAVA type

In JAVA, a byte always considered as signed when converted to another type. We must mask the sign bi...
  • wxyxl
  • wxyxl
  • 2001-05-04 14:13:00
  • 689

Android第三方框架 Universal-Image-Loader的使用,进一步封装

1、新建MyApplication类public class MyApplication extends Application { @Override public void onCr...
  • zss1973
  • zss1973
  • 2015-10-23 19:39:31
  • 1116

Universal-Image-Loader 使用详解

UIL出来也很久了,网上的使用方法大多不全,或者是基于老的版本而来的,有必要做些更新了。因此,下文内容,将基于:v1.9.5版本描述。以下内容翻译自 Android-Universal-Image-...
  • watermusicyes
  • watermusicyes
  • 2016-03-29 17:36:05
  • 4532

Android-Universal-Image-Loader使用demo,超详细!!!

所需要的权限: 初始化: public class MyApplication extends Applicat
  • wuqingyidongren
  • wuqingyidongren
  • 2016-04-14 15:50:03
  • 1212

UniversalImageLoader的用法总结

转载请注明出处:http://blog.csdn.net/crazy1235/article/details/51471280UIL的功能及优点 UIL的使用 具体配置 滚动时暂定加载作为图片加载类库...
  • crazy1235
  • crazy1235
  • 2017-04-20 22:41:25
  • 2769

深入解析开源项目之Universal-Image-Loader(一)框架篇

ImageLoader是一个优秀的图片加载开源项目,很多童鞋都在自己的项目中用到了。优秀的项目从来都是把简单留给开发者,把复杂封装在框架内部。...
  • zhengzechuan91
  • zhengzechuan91
  • 2015-12-13 11:37:47
  • 1526

深入解析开源项目之Universal-Image-Loader(二)缓存篇

Universal-Image-Loader(Github地址) 是一个优秀的图片加载开源项目,很多童鞋都在自己的项目中用到了。优秀的项目从来都是把简单留给开发者,把复杂封装在框架内部。...
  • zhengzechuan91
  • zhengzechuan91
  • 2015-12-15 13:17:54
  • 742

Android-Universal-Image-Loader的工具类封装

在Android开发中对图片资源的处理已经司空见惯了,如果还是使用Android API提供的方法来处理图片(尤其是网络图片),不仅复杂工作量大,而且还达不到好的一个效果.所以最终选择一些图片处理框架...
  • bighuan
  • bighuan
  • 2017-03-01 08:28:38
  • 697

Android开源框架Image-Loader1.9.5详解

如果说评价一下哪个图片开源库最被广泛使用的话,我想应该可以说是Universal-Image-Loader,在主流的应用中如 果你随便去反编译几个,基本都能看到他的身影,它就像个图片加载守护者,默默...
  • qq_33152517
  • qq_33152517
  • 2017-04-21 13:20:10
  • 699

universal-image-loader使用步骤+加载时listview中出现图片闪烁

universal-image-loader使用步骤+加载时listview中出现图片闪烁 在安卓开发过程中难免会遇到以下几个情况: 1、图片异步加载 2、图片缓存 ...
  • public_calss
  • public_calss
  • 2017-03-20 17:00:29
  • 213
收藏助手
不良信息举报
您举报文章:Universal-Image-Loader 使用
举报原因:
原因补充:

(最多只允许输入30个字)