图片缓存ImageLoader的使用

转载请注明:http://blog.csdn.net/wlytctw/article/details/51226728

在开发当中对ListView ,GridView和Viewpager加载图片,通常都涉及缓存!为此在这里列出ImageLoader 开源框架的使用!如需下载源码可以在Github上下载相关代码:https://github.com/nostra13/Android-Universal-Image-Loader

我们先了解一下ImageLoader的特性:
(一)功能特性

  1. 多流图像加载异步或同步
  2. ImageLoader定制的配置(线程执行人,下载器、解码器、内存和磁 盘缓存,显示图象选项,等等。
  3. 图片加载使用异步,加载Sdcard、内存缓存
  4. 设置加载期间、加载失败、加载完成的监听显示不同的图片

(二) 能够接收的URL实例:

1."http://site.com/image.png" // 从Web
2."file:///mnt/sdcard/image.png" //  从SDcard 存储卡读取
3."file:///mnt/sdcard/video.mp4" //  从SDcard 存储卡读取(视频缩略图)
4."content://media/external/images/media/13" // 从内容提供者读取
5."content://media/external/video/media/13" // 从内容提供者读取视频缩略图
6."assets://image.png" // 从assets 文件夹读取
7."drawable://" + R.drawable.img // 从画板img(non-9patch图像)

实现的图形素材:
图片缓存ImageLoader的使用_第1张图片

(三)集成实现:

1、在你的全局的 Application 中配置一些参数,对于Application在AndroidManifest.xml 的声明就在不在这里提及了!


public class AppApplication extends Application {
    @Override
    public void onCreate() {

        if (Constants.Config.DEVELOPER_MODE && Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectAll().penaltyDialog().build());
            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyDeath().build());
        }
        super.onCreate();
        initImageLoader(getApplicationContext());

    }

    public static void initImageLoader(Context context) {
        // This configuration tuning is custom. You can tune every option, you may tune some of them,
        // or you can create default configuration by
        // ImageLoaderConfiguration.createDefault(this);
        // method.
        ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context);
        config.threadPriority(Thread.NORM_PRIORITY - 2);
        config.denyCacheImageMultipleSizesInMemory();
        config.diskCacheFileNameGenerator(new Md5FileNameGenerator());
        config.diskCacheSize(50 * 1024 * 1024); // 50 MiB
        config.tasksProcessingOrder(QueueProcessingType.LIFO);
        config.writeDebugLogs(); // Remove for release app

        // Initialize ImageLoader with configuration.
        ImageLoader.getInstance().init(config.build());
    }
}

2、因为当中涉及到内存缓存所以我们需要在AndroidManifest.xml 文件声明读写SDcard的权限:

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />

3、在ListView 或者 GridView 的Adapter适配器中设置以下代码:

private Context mContext;
    private ImageLoader imageLoader;
    private DisplayImageOptions options;
    public ImageAdapter(Context context) {
        super();
        this.mContext = context;
        if (!imageLoader.isInited()) {
            ImageUtils.initImageLoader(context);
        }
        options = new DisplayImageOptions.Builder()
        .showImageOnLoading(R.drawable.ic_stub)  //设置加载工程中的图片
        .showImageForEmptyUri(R.drawable.ic_empty) // 设置URL 地址为空的时候加载的图片
        .showImageOnFail(R.drawable.ic_error)   // 设置图片加载或解码转换失败时显示的图片
        .cacheInMemory(true)   // 是否缓存到内存当中 默认 为 false 
        .cacheOnDisk(true)  // 是否缓存咋Sdcard 存储卡中 默认为 false
        .considerExifParams(true)  //
        .considerExifParams(true).bitmapConfig(Bitmap.Config.RGB_565) //(1)设置为这种避免出现 OOMemory 异常
        .imageScaleType(ImageScaleType.EXACTLY)    // (2)设置为这种避免出现 OOMemory 异常
// .displayer(new CircleBitmapDisplayer(Color.WHITE, 5)) //
        .build();
    }

4、ImageUtils.java 代码如下:

public class ImageUtils {

    private static FileNameGenerator generator;
    /** * 初始化 ImageLoader * @param context */
    public static void initImageLoader(Context context) {
        if (generator == null) {
            generator = new HashCodeFileNameGenerator();
        }

        File cacheDir = StorageUtils.getCacheDirectory(context);
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
                context)
        .memoryCacheExtraOptions(480, 800)
        .diskCacheExtraOptions(480, 800, null)
        //
        .threadPriority(Thread.NORM_PRIORITY - 2)
        .tasksProcessingOrder(QueueProcessingType.LIFO)
        //
        //
        .denyCacheImageMultipleSizesInMemory()
        .memoryCache(new WeakMemoryCache())
        .memoryCacheSizePercentage(15)
        //
        .diskCache(new UnlimitedDiscCache(cacheDir))
        // default
        .diskCacheSize(50 * 1024 * 1024).diskCacheFileCount(1000)
        .diskCacheFileNameGenerator(generator)//
        // .writeDebugLogs() // Remove for release app
        .build();

        ImageLoader.getInstance().init(config);
    }

}

5、在Adapter的getView 当中使用 以下方式即可:

imageLoader.displayImage(list.get(position).getIcon().toString(), holder.iv_icon, options);

显示网络、缓存、内存加载的图片!

6、加载和显示的任务流如下图:
图片地址:
https://raw.githubusercontent.com/nostra13/Android-Universal-Image-Loader/master/wiki/UIL_Flow.png
图片缓存ImageLoader的使用_第2张图片

你可能感兴趣的:(缓存,开源框架,imageloade)