转载自http://blog.csdn.net/zenjj11/article/details/38728481

项目介绍:

Android上最让人头疼的莫过于从网络获取图片、显示、回收,不论什么一个环节有问题都可能直接OOM。这个项目也许能帮到你。Universal Image Loader for Android的目的是为了实现异步的网络图片载入、缓存及显示,支持多线程异步载入

它最初来源于Fedor Vlasov的项目,且自此之后,经过大规模的重构和改进。

特性列举:

多线程下载图片,图片能够来源于网络,文件系统,项目目录assets中以及drawable中等

支持任意的配置ImageLoader。比如线程池,图片下载器,内存缓存策略,硬盘缓存策略。图片显示选项以及其它的一些配置

支持图片的内存缓存。文件系统缓存或者SD卡缓存

支持图片下载过程的监听

依据控件(ImageView)的大小对Bitmap进行裁剪,降低Bitmap占用过多的内存

较好的控制图片的载入过程。比如暂停图片载入,又一次開始载入图片,一般使用在ListView,GridView中。滑动过程中暂停载入图片,停止滑动的时候去载入图片

提供在较慢的网络下对图片进行载入

使用过程:

创建默认的ImageLoader,全部的操作都由ImageLoader控制。该类使用单例设计模式,所以假设要获取该类的实力。须要调用getInstance()方法。

在使用ImageLoader显示图片之前。你首先要初始化它的配置,调用ImageLoaderConfiguration的init()方法,然后你就能够实现各种的显示了。

//创建默认的ImageLoader配置參数

ImageLoaderConfiguration configuration = ImageLoaderConfiguration

.createDefault(this);

//Initialize ImageLoader with configuration.

ImageLoader.getInstance().init(configuration);

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

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

ImageLoader imageLoader imageLoader = ImageLoader.getInstance();  

使用过程:

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

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以下是全部默认配置參数依据需求能够自己定义配置

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)图片载入监听器在这里吧能够设置载入时的动画或者进度条之类的东西这里

ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();
private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {
static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());
@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加入图片了

imageLoader.displayImage(imageUrl, imageview, options, animateFirstListener);  

缓存的清理:

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

@Override

public void onDestroy() {

super.onDestroy();

imageLoader.clearMemoryCache();

imageLoader.clearDiskCache();

}

GirdView,ListView载入图片:

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

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。我们应该怎么去改善呢?

  1. 降低线程池中线程的个数,在ImageLoaderConfiguration中threadPoolSize中配置,推荐配置1-5
  2. 在DisplayImageOptions选项中配置bitmapConfigBitmap.Config.RGB_565,由于默认是ARGB_8888, 使用RGB_565会比使用ARGB_8888少消耗2倍的内存
  3. 在ImageLoaderConfiguration中配置图片的内存缓存为memoryCache(newWeakMemoryCache()) 或者不使用内存缓存
  4. 在DisplayImageOptions选项中设置ImageScale.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设定的值来裁剪图片

希望能大家对图片的载入有到帮助,如有补充,敬请提出,我会更新在后面,谢谢

(转) Universal-Image-Loader使用大全(史上最屌)的更多相关文章

  1. 屌炸天实战 MySQL 系列教程(二) 史上最屌、你不知道的数据库操作

    此篇写MySQL中最基础,也是最重要的操作! 第一篇:屌炸天实战 MySQL 系列教程(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:屌炸天实战 MySQL 系列教程(二) 史上最屌.你不 ...

  2. 德哥的PostgreSQL私房菜 - 史上最屌PG资料合集

    德哥的PostgreSQL私房菜 - 史上最屌PG资料合集

  3. MySQL错误代码大全(史上最全)

    用任何主机语言调用MySQL时可能出现的错误.首先,列出了服务器错误消息.其次列出了客户端程序消息. B.1. 服务器错误代码和消息  服务器错误信息来自下述源文件: · 错误消息信息列在share/ ...

  4. [转]德哥的PostgreSQL私房菜 - 史上最屌PG资料合集

    链接地址:https://yq.aliyun.com/articles/59251

  5. 【2016年特别福利】史上最全CSS学习资料大全

    css学习篇 [2016年特别福利]史上最全CSS学习资料大全

  6. 史上最全最实用HBuilder快捷键大全

    史上最全最实用HBuilder快捷键大全 一.文件操作二.编辑操作三.插入操作四.转义操作五.选择操作六.跳转操作七.查找操作八.运行九.视图一.文件操作新建菜单: ctrl + N新建: ctrl ...

  7. GitHub上史上最全的Android开源项目分类汇总 (转)

    GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...

  8. Android中Universal Image Loader开源框架的简单使用

    UIL (Universal Image Loader)aims to provide a powerful, flexible and highly customizable instrument ...

  9. android universal image loader 缓冲原理详解

    1. 功能介绍 1.1 Android Universal Image Loader Android Universal Image Loader 是一个强大的.可高度定制的图片缓存,本文简称为UIL ...

随机推荐

  1. BZOJ 3473 字符串 ——广义后缀自动机

    这题就比较有趣了. 首先匹配一遍,然后统计子树叶子节点中包含大于等于k的节点个数(HH的项链) 然后就可以搞了. 关于合法的情况数,显然是l[i]-l[fa[i]],然后向下下传即可(YY一下). # ...

  2. BZOJ4199 [Noi2015]品酒大会 【后缀数组 + 单调栈 + ST表】

    题目 一年一度的"幻影阁夏日品酒大会"隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发"首席品 酒家"和"首席猎手"两个奖项,吸 ...

  3. Java程序性能优化之缓冲优化

    优化前的代码: package com; import javax.swing.*; import java.awt.*; /** * 使用Eclipse,右键Run As,Java Applet运行 ...

  4. cf299C Weird Game

    Weird Game Yaroslav, Andrey and Roman can play cubes for hours and hours. But the game is for three, ...

  5. (转)java 中变量存储位置总结

    1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符 ...

  6. shell按日期自动切割nginx日志脚本

    shell按日期自动切割nginx日志脚本 参考:自学it网 http://www.zixue.it/. #nginx日志切割脚本 #author:ce #!/bin/bash #设置日志文件存放目录 ...

  7. HDU 4917 Permutation(拓扑排序 + 状压DP + 组合数)

    题目链接 Permutation 题目大意:给出n,和m个关系,每个关系为ai必须排在bi的前面,求符合要求的n的全排列的个数. 数据规模为n <= 40,m <= 20. 直接状压DP空 ...

  8. P1067 多项式输出 (模拟)

    题目描述 一元nn次多项式可用如下的表达式表示: 其中,a_i x^i 称为i次项,ai​ 称为i次项的系数.给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式: 多项式中自变量 ...

  9. 洛谷—— P2656 采蘑菇

    https://www.luogu.org/problem/show?pid=2656 题目描述 小胖和ZYR要去ESQMS森林采蘑菇. ESQMS森林间有N个小树丛,M条小径,每条小径都是单向的,连 ...

  10. luogu P1080 国王游戏

    题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最 ...