Android图片下载缓存框架 Android-Universal-Image-Loader 五分钟快速搭建

笑谈风云,一语定乾坤。大家好,我是皖江。工欲善其事必先利其器。今天来看一看android的图片下载缓存框架Android-Universal-Image-Loader如何快速配置进项目中。

简介

Android-Universal-Image-Loader 是一款开源的图片下载缓存框架。它有如下特性:

1.多线程图像加载(异步或同步)
2.ImageLoader的配置(线程执行器,下载器,解码器,内存和磁盘缓存,显示图像选项等)
3.每个显示图像调用的许多定制选项(存根图像,缓存开关,解码选项,位图处理和显示等)
4.内存和/或磁盘(设备的文件系统或SD卡)上的图像缓存
5.监听加载过程(包括下载进度)

git项目地址:https://github.com/nostra13/Android-Universal-Image-Loader

实现原理:首先计算下载图片并计算图片大小,然后判断该图片是否在内存中,如果在内存中,则直接加载显示;否则判断是否在硬盘缓存中。如果在硬盘缓存中,则将图片编码,然后判断是否需要将图片加入内存,如需则将图片加入内存并加载显示,否则直接加载显示;如果不在硬盘缓存中则判断是否需要将图片缓存到硬盘中。最终在进行显示。

整体用的还是三级缓存结构,流程图如下:


快速接入

下载jar包,并将jar包导入lib文件夹下。

下载地址:http://download.csdn.net/detail/shirakawakanaki/9662172  不需要积分

配置权限

<span style="font-weight: bold;">    </span><uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
所需权限不多,基本给足。

初始化配置

    /**
     * 初始化AUIL图片加载引擎
     * @param context
     */
    public void initImageLoader(Context context){
        ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context);
        config.memoryCacheExtraOptions(1080,1920);//设置缓存每个图片的最大宽长
        config.threadPoolSize(5);//设置缓存池的大小
        config.threadPriority(Thread.NORM_PRIORITY - 2);//设置线程运行优先级为3 低于普通线程优先级
        config.denyCacheImageMultipleSizesInMemory();
        config.diskCacheFileNameGenerator(new Md5FileNameGenerator());//硬盘缓存文件名采用MD5加密策略 HashCodeFileNameGenerator()还可以用hashcode进行加密
        config.diskCacheSize(50 * 1024 * 1024); // 默认设置50M硬盘缓存空间
        config.memoryCacheSize(2*1024*1024);//设置内存缓存大小
        config.diskCacheFileCount(50);//设置硬盘缓存文件数目
        config.tasksProcessingOrder(QueueProcessingType.LIFO);
        config.writeDebugLogs(); //开启日志打印  生产版本请关闭
        File cacheDir = new File(Environment.getExternalStorageDirectory()+"/image/cache");
        config.diskCache(new UnlimitedDiskCache(cacheDir));//自定义缓存路径
        config.imageDownloader(new BaseImageDownloader(context,5*1000,10*1000));//设置超时时间
        ImageLoader.getInstance().init(config.build());
    }
初始化请放在Application中

构造图片下载配置

           DisplayImageOptions options = new DisplayImageOptions.Builder()
                    .showImageOnLoading(R.drawable.ic_stub)//正在下载图片时候的样式
                    .showImageForEmptyUri(R.drawable.ic_empty)//图片地址为空时候的样式
                    .showImageOnFail(R.drawable.ic_error)//图片下载错误时候的样式
                    .cacheInMemory(true)//是否使用内存缓存  LruCache
                    .cacheOnDisk(true)//是否使用硬盘缓存 DiskLruCache
                    .considerExifParams(true) //是否考虑JPEG图像EXIF参数(旋转,翻转)
                    .bitmapConfig(Bitmap.Config.RGB_565)//尽量采用质量差一点的  减少内存的使用
                    .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//设置图片以如何的编码方式显示   EXACTLY :图像将完全按比例缩小的目标大小 EXACTLY_STRETCHED:图片会缩放到目标大小 IN_SAMPLE_INT:图像将被二次采样的整数倍 IN_SAMPLE_POWER_OF_2:图片将降低2倍,直到下一减少步骤,使图像更小的目标大小 NONE:图片不会调整
                    .displayer(new CircleBitmapDisplayer(Color.WHITE, 5))//采用圆形样式  边框宽度为5  边框颜色为白色 也可以用圆角样式(会生成ARGB_8888的图片,加剧内存的损耗,不推荐)
                    .resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位
                    .build();
 ImageLoader imageLoader = ImageLoader.getInstance();
配置图片加载监听器
    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);//渐进式动画  给imageView设置内容
                    displayedImages.add(imageUri);
                }
            }
        }
    }
加载图片
 imageLoader.displayImage(imageUrl, imageView, options, animateFirstListener);//将图片加入缓存 第一个参数是图片地址,第二个是ImageView,第三个是图片下载配置 第四个是图片下载监听器
其他使用方法
如果需要对图片下载的进度进行监听,如下:

			ImageLoader.getInstance()
					.displayImage(imageUrl, imageView, options, new SimpleImageLoadingListener() {
						@Override
						public void onLoadingStarted(String imageUri, View view) {
							progressBar.setProgress(0);
							progressBar.setVisibility(View.VISIBLE);
						}

						@Override
						public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
							progressBar.setVisibility(View.GONE);
						}

						@Override
						public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
							progressBar.setVisibility(View.GONE);
						}
					}, new ImageLoadingProgressListener() {//这里可以动态设置进度
						@Override
						public void onProgressUpdate(String imageUri, View view, int current, int total) {
							progressBar.setProgress(Math.round(100.0f * current / total));
						}
					});
注意事项:

未保证内存的充分使用,线程池的大小不宜过大。图片格式尽量选RGB_256。这样会减少OM的出现几率。

以上。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值