Android开源框架ImageLoader:加载图片的三级缓存机制

前言:可从  https://github.com/nostra13/Android-Universal-Image-Loader 下载三级缓存机制的开源框架。下文简单介绍该框架中主要的常用方法,掌握这些方法,基本就可应对多数图片下载的需求。

注意:以下代码为示意代码片断,仔细读一下应能知道怎么用。蓝色表示为开源框架中的类。

1.初始化ImageLoader类对象:

ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.stop();     // 停止加载图片
imageLoader.clearMemoryCache();     // 清除内存缓存
imageLoader.clearDiscCache();       // 清除SD卡中的缓存

2.在Adapter的getView( ) 方法中,显示ImageView的图片的imageLoader.displayImage( )方法:

  ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();
    /**
     * 显示图片
     * 参数1:图片url
     * 参数2:显示图片的控件
     * 参数3:显示图片的设置
     * 参数4:监听器
     */
    imageLoader.displayImage(imageUrl, holder.image, options, animateFirstListener);
    // 将图片显示任务增加到执行池,图片将被显示到ImageView当轮到此ImageView
    imageLoader.displayImage(imageUrl, imageView, options);
    // 参数传入匿名内部类
    imageLoader.displayImage(imageUrl, imageView, options, new SimpleImageLoadingListener() {
                @Override
                public void onLoadingStarted(String imageUri, View view) {
                    // 可显示进度条
                }  

                @Override
                public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
                    String message = null;
                    switch (failReason.getType()) {     // 获取图片失败类型
                        case IO_ERROR:              // 文件I/O错误
                            message = "Input/Output error";
                            break;
                        case DECODING_ERROR:        // 解码错误
                            message = "Image can't be decoded";
                            break;
                        case NETWORK_DENIED:        // 网络延迟
                            message = "Downloads are denied";
                            break;
                        case OUT_OF_MEMORY:         // 内存不足
                            message = "Out Of Memory error";
                            break;
                        case UNKNOWN:               // 原因不明
                            message = "Unknown error";
                            break;
                    }
                    Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
                }  

                @Override
                public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                    // 不显示圆形进度条
                }
            });  

3.上述2.中imageLoader.displayImage( )方法的参数options:

DisplayImageOptions options;        // DisplayImageOptions是用于设置图片显示的类
options = new DisplayImageOptions.Builder()
    .showStubImage(R.drawable.ic_stub)          // 设置图片下载期间显示的图片
    .showImageForEmptyUri(R.drawable.ic_empty)  // 设置图片Uri为空或是错误的时候显示的图片
    .showImageOnFail(R.drawable.ic_error)       // 设置图片加载或解码过程中发生错误显示的图片
    .cacheInMemory(true)                        // 设置下载的图片是否缓存在内存中
    .cacheOnDisc(true)                          // 设置下载的图片是否缓存在SD卡中
.bitmapConfig(Bitmap.Config.RGB_565)     //设置图片的解码类型
    .displayer(new RoundedBitmapDisplayer(20))  // 设置成圆角图片
    .build();                                   // 创建配置过得DisplayImageOption对象

4.上述2.中imageLoader.displayImage( )方法的参数animateFirstListener:

/**
* 图片加载第一次显示监听器
* @author Administrator
*
*/
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);
            }
        }
    }
}

5.该框架主要是以上方法,下面的也可了解下:

listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, true, false));
//一堆图片链接
com.nostra13.example.universalimageloader.Constants.IMAGES;
// Intent中传递Extra参数的键 :"com.nostra13.example.universalimageloader.IMAGES";
com.nostra13.example.universalimageloader.Constants.Extra.IMAGES
// Intent中传递Extra参数的键 :"com.nostra13.example.universalimageloader.IMAGE_POSITION"
com.nostra13.example.universalimageloader.Constants.Extra.IMAGE_POSITION

时间: 2024-12-28 06:07:04

Android开源框架ImageLoader:加载图片的三级缓存机制的相关文章

Android 开源框架Universal-Image-Loader加载https图片

解决方案就是 需要 android https HttpsURLConnection 这个类忽略证书 1,找到 Universal-Image-Loader的library依赖包下面com.nostra13.universalimageloader.core.download下面的BaseImageDownloader这个类 里面的createConnection这个方法,添加如下: 1 protected HttpURLConnection createConnection(String ur

开源项目WebImageView加载图片

项目地址:https://github.com/ZaBlanc/WebImageView 作者对加载图片,以及图片的内存缓存和磁盘缓存做了封装. 代码量不多,但是能够满足一般的加载图片. 先看下项目结构: 我认为通常情况下自己去实现的话,这点需要仔细看下. /** * * @param urlString 对应图片的网络地址 * @return */ private String hashURLString(String urlString) { try { // Create MD5 Hash

Picasso图片框架加载图片 使用及缓存问题

项目中用的Picasso 框架 ,加载图片.使用很方便 而且缓存机制非常强大. 正常使用我们可以这样直接调用,我把方法写到一个util里面了. 调用代码如下: PicassoUtil.displayImage(context, Constants.U_IMG_URL, R.drawable.default, iv_icon); Util工具类 import java.io.File; import android.content.Context; import android.text.Text

Android之ListView异步加载图片且仅显示可见子项中的图片

折腾了好多天,遇到 N 多让人崩溃无语的问题,不过今天终于有些收获了,这是实验的第一版,有些混乱,下一步进行改造细分,先把代码记录在这儿吧. 网上查了很多资料,发现都千篇一律,抄来抄去,很多细节和完整实例都没看到,只有自己一点点研究了,总体感觉 android 下面要显示个图片真不容易啊. 项目主要实现的功能: 异步加载图片图片内存缓存.异步磁盘文件缓存解决使用 viewHolder 后出现的图片错位问题优化列表滚动性能,仅显示可见子项中的图片无需固定图片显示高度,对高度进行缓存使列表滚动时不会

Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案

Android中ListView异步加载图片错位.重复.闪烁问题分析及解决方案 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如ListView上有100个Item,一屏只显示10个Item,我们知道getView()中convertView是用来复用View对象的,因为一个Item的对应一个View对象,而ImageView控件就是View对象通

高效地加载图片(四) 管理缓存

除了缓存图片意外,还有一些其他的方式来促进GC的效率和图片的复用.不同的Android系统版本有不同的处理策略.BitmapFun中就包含了这个类,能够使我们高效地构建我们的项目. 为了开始以下教程,我们需要先介绍一下Android系统对Bitmap管理的进化史. 在Android2.2(API level 8)以及更低的版本中,当垃圾被回收时,应用的线程会被停止,这会造成一定程度的延时.在Android 2.3中,加入了并发回收机制,这意味着当Bitmap不再被使用的时候,内存会被很快地回收.

基于开源框架Glide加载Gif资源图到Android ImageView中

<基于第三方开源框架Android Glide加载Gif资源图片到Android ImageView中> 通常Android的ImageView不能加载Gif图片,如不做任何处理,那么加载到ImageView中的Gif只显示第一帧.网上给出很多解决方案,也有不少开源框架定制专属的Gif View用于加载Gif图,这些解决方案基本上大多数是借助Android的Movie,把Gif图片资源作为流,解析成Android Movie显示,这些定制的基本思想就是先检测该图片资源是否是Gif图,若是,则按

Android开源框架Image-Loader详解

如果说评价一下哪个图片开源库最被广泛使用的话,我想应该可以说是Universal-Image-Loader,在主流的应用中如 果你随便去反编译几个,基本都能看到他的身影,它就像个图片加载守护者,默默的守护着图片加载.相信很多人对 这个异步加载图片框架还不是很熟,再加上最近它更改优化了好几个地方,而网上的大部分资料还是以前的,于是花 了几天时间专门的研究了下开源框架Universal-Image-Loader(实际上是近期项目刚好用到,且仔细的考虑过各种情 况),希望对新手能有所帮助,也希望大神能

浅析Android 开源框架ImageLoader的用法

一.前言 在Android开发中,会经常涉及到显示图片的相关操作,在网上查阅资料,ImageLoader得到大家广泛的使用,本篇文章针对初使用者的一个向导,同时也是自己使用该框架的一个总结,主要包含: ## 源码浅析 ## ## 使用教程 ## ## 用法总结及demo下载 ## 二.源码浅析 从用法来看,我们在使用该框架的时候,会先做一个初始化操作(一般在Application中), ImageLoader imageLoader = ImageLoader.getInstance(); im