【转】Universal-Image-Loader(android图片缓存)

原文http://write.blog.csdn.net/postedit?ref=toolbar

项目介绍:

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

特性列举:

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

使用过程:

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

1         //创建默认的ImageLoader配置参数
2         ImageLoaderConfiguration configuration = ImageLoaderConfiguration
3                 .createDefault(this);
4         //Initialize ImageLoader with configuration.
5         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)图片加载监听器在这里吧可以设置加载时的动画或者进度条之类的东西这里

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添加图片了

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停止滑动的时候加载当前界面的图片,这个框架当然也提供这个功能,使用起来也很简单,它提供了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,我们应该怎么去改善呢?

减少线程池中线程的个数,在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设定的值来裁剪图片

时间: 2024-10-06 07:25:40

【转】Universal-Image-Loader(android图片缓存)的相关文章

Android图片缓存技术!直接用在你的项目中,简单方便高效

好久没有写博客了,最近比较繁琐,什么面试呀,找工作呀,大三的生活就快完了,准确的是大学的生活就快完了!三年了,一直在搞移动开发,感觉好快呀,不想就这样的离开学校了!咳咳咳,扯远了... 前不久搞的Android图片缓存,刚开始引入开源的框架,用着还行,但是在开发中遇到问题,就比如universal-image-loader-1.9.5.jar这个框架吧,在加载图片的时候自定义imageview无法加载,可能是存在以下问题吧,况且导入框架导致开发的项目包越来越大,基于上面的这几种情况,于是我就想自

android图片缓存框架Android-Universal-Image-Loader(二)

这篇打算直接告诉大家怎么用吧,其实这个也不是很难的框架,大致使用过程如下: // 获取缓存图片目录 File cacheDir = StorageUtils.getOwnCacheDirectory(activity, "imageloader/Cache"); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder( activity).memoryCacheExtraOptions(800, 76

android图片缓存框架Android-Universal-Image-Loader

最近跟同学们做了一个创业项目,其实跟以前做项目不同,以前大多数都是做web网站,对内存管理这些不太关注,因为是pc机,做android的话也就是一些小列子,现在到了做产品阶段吧,只能把项目做到最优.不扯了,先来说这个框架是做什么的,Android-Universal-Image-Loader主要是一个图片的缓存框架,根据官方解释就是,它提供了一个异步处理图片的方案.它提供两种获取图片方式async or sync,并且提供了一个可定制化的组件(thread executors, download

图片会说话系列之Android图片缓存框架

前言:看过很多精彩的文章,作者写的非常好,但总觉得文字描述没有图片或图表说明来得直观,因为图片可以化抽象为具体.语言是有区域性的,而图片则是全世界通用的,即使语言不通,却能通过图片了解一切.因此想做一个系列的简博客,内容就是一张图附带一些必要的说明,这样就能迅速抓住重点,而不需要做太多的阅读,便能了解框架性的东西.文章所涉及到的图片有的可能来自官方网站,有的来自名家博客,或者是自己绘制的,都会一一说明. 切入正题,先来第一发,上图: 上图来自:https://github.com/nostra1

Universal-Image-Loader(android图片缓存)

转载请注明http://write.blog.csdn.net/postedit?ref=toolbar 点击下载所需jar文件 具体资料整理请加群284568173自行下载pdf 项目介绍: Android上最让人头疼的莫过于从网络获取图片.显示.回收,不论什么一个环节有问题都可能直接OOM.这个项目也许能帮到你.Universal Image Loader for Android的目的是为了实现异步的网络图片载入.缓存及显示,支持多线程异步载入.它最初来源于Fedor Vlasov的项目.且

Android图片缓存分析(一)

Android中写应用时,经常会遇到加载图片的事,由于很多图片是网络上下载获取的,当我们进页面时,便会去网络下载图片,一两次可能没啥问题,但如果同一张图片每次都去网络拉取,不仅速度慢,更影响用户体验,同时会浪费用户的流量. 基于此,很多人便想到了图片缓存的方法. 现在比较普遍的图片缓存主要有以下几个步骤: 一.从缓存中获取图片 二.如果缓存中未获取图片,则从存储卡中获取 三.如果存储卡中未获取图片,则从网络中获取 一.从缓存中获取图片 我们知道,Android中分配给每个应用的内存空间是有限的,

Android 图片缓存设计

1.简介 大家都知道,在我们Android 开发的过程中,对于图片的处理,是非常重要的,而对于我们如果每次都重网络去拉去图片,那样会造成,现在android应用中不可避免的要使用图片,有些图片是可以变化的,需要每次启动时从网络拉取,这种场景在有广告位的应用以及纯图片应用(比如淘宝,qq的照片墙)中比较多. 现在有一个问题:假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量.在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响.当然,我想,

Android图片缓存库使用经验总结

Volley,Universal-Image-Loader和picasso 几个图片加载请求 框架的分析 http://www.wl566.com/biancheng/154046.html http://blog.csdn.net/djun100/article/details/24708825 主要是 在 ListView 滑动的时候,取消已经消失的,省下资源. Picasso 和 Universal-Image-Loader 都做了. volley 取消 好像要我们自己去取消, cancl

Android 图片缓存机制

1.采用线程池 2.内存缓存+文件缓存 3.内存缓存中网上很多是采用SoftReference来防止堆溢出,这儿严格限制只能使用最大JVM内存的1/4 4.对下载的图片进行按比例缩放,以减少内存的消耗 具体的代码里面说明.先放上内存缓存类的代码MemoryCache.java: public class MemoryCache { private static final String TAG = "MemoryCache"; // 放入缓存时是个同步操作 // LinkedHashM