转载自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创建一个设置

  1. File cacheDir =StorageUtils.getOwnCacheDirectory(this, "imageloader/Cache");
  2. ImageLoaderConfigurationconfig = new ImageLoaderConfiguration
  3. .Builder(this)
  4. .memoryCacheExtraOptions(480, 800) // maxwidth, max height,即保存的每一个缓存文件的最大长宽
  5. .threadPoolSize(3)//线程池内载入的数量
  6. .threadPriority(Thread.NORM_PRIORITY -2)
  7. .denyCacheImageMultipleSizesInMemory()
  8. .memoryCache(new UsingFreqLimitedMemoryCache(2* 1024 * 1024)) // You can pass your own memory cache implementation/你能够通过自己的内存缓存实现
  9. .memoryCacheSize(2 * 1024 * 1024)
  10. .discCacheSize(50 * 1024 * 1024)
  11. .discCacheFileNameGenerator(newMd5FileNameGenerator())//将保存的时候的URI名称用MD5 加密
  12. .tasksProcessingOrder(QueueProcessingType.LIFO)
  13. .discCacheFileCount(100) //缓存的文件数量
  14. .discCache(new UnlimitedDiscCache(cacheDir))//自己定义缓存路径
  15. .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
  16. .imageDownloader(new BaseImageDownloader(this,5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超时时间
  17. .writeDebugLogs() // Remove for releaseapp
  18. .build();//開始构建
  19. ImageLoader.getInstance().init(config);

得到imageLoader

  1. ImageLoader imageLoader imageLoader = ImageLoader.getInstance();

使用过程:

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

  1. DisplayImageOptions options = new DisplayImageOptions.Builder()
  2. .showImageOnLoading(R.drawable.ic_stub) //载入图片时的图片
  3. .showImageForEmptyUri(R.drawable.ic_empty) //没有图片资源时的默认图片
  4. .showImageOnFail(R.drawable.ic_error) //载入失败时的图片
  5. .cacheInMemory(true) //启用内存缓存
  6. .cacheOnDisk(true) //启用外存缓存
  7. .considerExifParams(true) //启用EXIF和JPEG图像格式
  8. .displayer(new RoundedBitmapDisplayer(20)) //设置显示风格这里是圆角矩形
  9. .build();

DisplayImageOptions以下是全部默认配置參数依据需求能够自己定义配置

  1. private int imageResOnLoading = 0;
  2. private int imageResForEmptyUri = 0;
  3. private int imageResOnFail = 0;
  4. private Drawable imageOnLoading = null;
  5. private Drawable imageForEmptyUri = null;
  6. private Drawable imageOnFail = null;
  7. private boolean resetViewBeforeLoading = false;
  8. private boolean cacheInMemory = false;
  9. private boolean cacheOnDisk = false;
  10. private ImageScaleType imageScaleType = ImageScaleType.IN_SAMPLE_POWER_OF_2;
  11. private Options decodingOptions = new Options();
  12. private int delayBeforeLoading = 0;
  13. private boolean considerExifParams = false;
  14. private Object extraForDownloader = null;
  15. private BitmapProcessor preProcessor = null;
  16. private BitmapProcessor postProcessor = null;
  17. private BitmapDisplayer displayer = DefaultConfigurationFactory.createBitmapDisplayer();
  18. private Handler handler = null;
  19. private boolean isSyncLoading = false;

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

  1. ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();
  2. private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {
  3. static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());
  4. @Override
  5. public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
  6. if (loadedImage != null) {
  7. ImageView imageView = (ImageView) view;
  8. boolean firstDisplay = !displayedImages.contains(imageUri);
  9. if (firstDisplay) {
  10. FadeInBitmapDisplayer.animate(imageView, 500);
  11. displayedImages.add(imageUri);
  12. }
  13. }
  14. }
  15. }

(3)简单设置就能够给ImageView加入图片了

  1. 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滑动过程中停止去载入图片,该类使用的是代理模式

  1. listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
  2. 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. Cocoa-Cocoa对象

    2.Cocoa对象 2.1 Objective-C是面向对象的语言 Objective-C和Java C++一样,有封装,继承,多态,重用.但是它不像C++那样有重载操作法.模版和多继承,也没有Jav ...

  2. conda管理包

    清理 conda clean --lock --tarball --package (安装包) 安装或更新包 conda install numpy=1.9.3 conda update numpy= ...

  3. [HNOI2002]彩票 (搜索+剪枝)

    题目描述 某地发行一套彩票.彩票上写有1到M这M个自然数.彩民可以在这M个数中任意选取N个不同的数打圈.每个彩民只能买一张彩票,不同的彩民的彩票上的选择不同. 每次抽奖将抽出两个自然数X和Y.如果某人 ...

  4. 【bzoj1193】[HNOI2006]马步距离

    [HNOI2006]马步距离 Description Input 只包含4个整数,它们彼此用空格隔开,分别为xp,yp,xs,ys.并且它们的都小于10000000. Output 含一个整数,表示从 ...

  5. C 语言中可以调用命令行指令的 system()函数

    C语言有一个system函数(在<stdlib.h>头中,C++则为<cstdlib>头),可以用来调用终端命令.原型如下: int system(const char *cm ...

  6. intellij idea 使用用到的问题

    1.github error setting certificate verify locations使用github时报错,解决方法: git config --system http.sslcai ...

  7. 洛谷 [P1290] 欧几里得的游戏

    SG函数的应用 看到这题就想到了SG函数 那么可以考虑最终情况:一个数是x,另一个是0,那么先手必败(因为上一个人已经得到0了,其实游戏已经结束了) 剩下的情况:一个数n, 一个数m,假设n>m ...

  8. POJ3345 Bribing FIPA

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5021   Accepted: 1574 Description There ...

  9. h5表单验证的css和js方法

    1.css3 提示只适用于高级浏览器: Chrome,Firefox,Safari,IE9+ valid.invalid.required的定义 代码如下: input:required, input ...

  10. 动态添加radiogroup

    private LinearLayout layout; //布局 , 可以在xml布局中获得 private RadioGroup group ; //点选按钮组 public void onCre ...