学而实习之 不亦乐乎

Android 图片框架 ImageLoader 的用法

2023-08-14 08:06:18

一、原理概述

ImageLoader 在显示图片的时候,会先在内存中查找;如果没有,就去本地查找;如果还没有,就开一个新的线程去下载这张图片,下载成功会把图片同时缓存到内存和本地。

尽管 ImageLoader 很强大,但一直把图片缓存在内存中,会导致内存占用过高。虽然对图片的引用是软引用,软引用在内存不够的时候会被GC,但我们还是希望减少GC的次数,因此我们可以在每一次退出一个页面的时候,把 ImageLoader 内存中的缓存全都清除,这样就节省了大量内存,反正下次再用到的时候从本地再取出来就是了。

如,在 MainActivity 的 onDestroy() 生命周期方法中,执行了 ImageLoader 的 clearMemoryCache() 方法,以确保页面销毁时把 ImageLoader 在内存中的缓存清除。这样,即使其他地方需要复用之前的图片,虽然内存中没有了,但还是可以在本地磁盘上找到。

@Override
protected void onDestroy() {
    // 回收该页面缓存在内存中的图片
    imageLoader.clearMemoryCache();
    super.onDestroy();
}

二、使用方法

1、导入项目依赖

compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

2、初始化框架

DisplayImageOptions options = new DisplayImageOptions.Builder()
                .cacheInMemory(false) //设置下载的图片是否缓存在内存中
                .cacheOnDisc(true)//设置下载的图片是否缓存在SD卡中
                .showImageOnLoading(R.drawable.zhanwei_shape)
                .showImageOnFail(R.drawable.zhanwei_shape)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .considerExifParams(true)//是否考虑JPEG图像EXIF参数(旋转,翻转)
                .resetViewBeforeLoading(true)// 设置图片在下载前是否重置,复位
                .build();

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(myApplation)
                .memoryCacheExtraOptions(480, 800) //即保存的每个缓存文件的最大长宽
                .threadPoolSize(3) //线程池内加载的数量
                .threadPriority(Thread.NORM_PRIORITY - 2)
                .denyCacheImageMultipleSizesInMemory()
                .diskCacheFileNameGenerator(new Md5FileNameGenerator()) //将保存的时候的URI名称用MD5 加密
                .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) //你可以通过自己的内存缓存实现
                .memoryCacheSize(2 * 1024 * 1024) // 内存缓存的最大值
                .diskCacheSize(50 * 1024 * 1024)  // 50 Mb sd卡(本地)缓存的最大值
                .tasksProcessingOrder(QueueProcessingType.LIFO)
                .defaultDisplayImageOptions(options)// 由原先的discCache -> diskCache
                .diskCache(new UnlimitedDiskCache(new File(Constants.FILEPATH)))//缓存路径
                .imageDownloader(new BaseImageDownloader(myApplation, 5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超时时间
                .writeDebugLogs() // Remove for release app
                .build();

ImageLoader.getInstance().init(config);//全局初始化此配置

3、使用

DisplayImageOptions options = new DisplayImageOptions.Builder()
            .cacheInMemory(true) //设置下载的图片是否缓存在内存中
            .cacheOnDisc(true)//设置下载的图片是否缓存在SD卡中
            .showImageOnLoading(R.drawable.zhanwei_avater)
            .showImageOnFail(R.drawable.zhanwei_avater)
            .bitmapConfig(Bitmap.Config.RGB_565)
            .considerExifParams(false)//是否考虑JPEG图像EXIF参数(旋转,翻转)
            .resetViewBeforeLoading(false)// 设置图片在下载前是否重置,复位
            .build();
ImageLoader.getInstance().displayImage(imageUri , imageview, options);