首页 > 代码库 > Android开源框架ImageLoader:加载图片的三级缓存机制

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 onl oadingStarted(String imageUri, View view) {  
                    // 可显示进度条  
                }  
 
                @Override  
                public void onl oadingFailed(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 onl oadingComplete(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 onl oadingComplete(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


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