第三方图片框架ImageLoader的使用

  • 内容
  • 评论
  • 相关

话说2013年的时候,有任务需要让一个GridView显示很多的缩略图,当时还没接触过图片加载框架,自己写的真是一个累啊,后来才意识到原来有很多处理的很好的图片加载的框架,ImageLoader就是其中一个,它解决了绝大部分的图片OOM问题,一直都用的是相当的爽啊。可是后来在世界最大男性交友网站-GitHub上看到作者已经不再维护这个框架了,从开始的27.11.2011到27.11.2015整整四年时间,如今距离不再维护的日期都已经过了整整一年了,所以说确实应该寻找一个更合适的加载框架了(下一篇就会说),既然已经不维护了,那么本篇也就是本着情怀去记录一下它的使用方法,防止以后看到老代码需要维护,具体的验证就不再进行了。从GitHub上也可以看到最新的1.9.5的版本,而且已经不是支持Android1.6+了,而是Android 2.0了。好了,正文开始。

ImageLoader的全局配置如下:

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
            context)
            // max width, max height,即保存的每个缓存文件的最大长宽
            .memoryCacheExtraOptions(480, 800)
            //设置缓存的详细信息,最好不要设置这个
            .discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null)
            // 线程池内加载的数量
            .threadPoolSize(3)
            // 线程优先级
            .threadPriority(Thread.NORM_PRIORITY - 2)
            .denyCacheImageMultipleSizesInMemory()
            // 你可以通过自己的内存缓存实现
            // .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))
            // .memoryCacheSize(2 * 1024 * 1024)
            //硬盘缓存50MB
            .diskCacheSize(50 * 1024 * 1024)
             //将保存的时候的URI名称用MD5
            .diskCacheFileNameGenerator(new Md5FileNameGenerator())
            //将保存的时候的URI名称用HASHCODE加密
             .diskCacheFileNameGenerator(new HashCodeFileNameGenerator())
            .tasksProcessingOrder(QueueProcessingType.LIFO)
             //缓存的File数量
             .diskCacheFileCount(100)
             // 自定义缓存路径
            .diskCache(new UnlimitedDiscCache(cacheDir))
            // .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
            // .imageDownloader(new BaseImageDownloader(context, 5 * 1000,
            // 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超时时间
            .writeDebugLogs() // Remove for release app
            .build();
    // 全局初始化此配置
    ImageLoader.getInstance().init(config);

支持的加载类型有如下几种:

"http://site.com/image.png" // from Web
"file:///mnt/sdcard/image.png" // from SD card
"file:///mnt/sdcard/video.mp4" // from SD card (video thumbnail)
"content://media/external/images/media/13" // from content provider
"content://media/external/video/media/13" // from content provider (video thumbnail)
"assets://image.png" // from assets
"drawable://" + R.drawable.img // from drawables (non-9patch images)

当然,官方也建议如果使用drawable的话还是用ImageView.setImageResource(...)比较好。

最简单的使用方式就是:

ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.displayImage(imageUri, imageView);

如果想在图片加载完后手动处理的话,可以加如下监听:

imageLoader.loadImage(imageUri, new SimpleImageLoadingListener() {
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        // Do whatever you want with Bitmap
    }
});

同样,你也可以直接获取这个url对应的Bitmap:

Bitmap bmp = imageLoader.loadImageSync(imageUri);

也可以添加更加复杂的监听:

imageLoader.displayImage(imageUri, imageView, options, new ImageLoadingListener() {
    @Override
    public void onLoadingStarted(String imageUri, View view) {
        ...
    }
    @Override
    public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
        ...
    }
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        ...
    }
    @Override
    public void onLoadingCancelled(String imageUri, View view) {
        ...
    }
}, new ImageLoadingProgressListener() {
    @Override
    public void onProgressUpdate(String imageUri, View view, int current, int total) {
        ...
    }
});

如果你想指定图像的大小,可以这样:

ImageSize targetSize = new ImageSize(80, 50);
imageLoader.loadImage(imageUri, targetSize, options, new SimpleImageLoadingListener() {
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        // Do whatever you want with Bitmap
    }
});

或是这样:

ImageSize targetSize = new ImageSize(80, 50);
Bitmap bmp = imageLoader.loadImageSync(imageUri, targetSize, options);

对于上面的options实际就是加载图片的一些配置,一下代码可以做参考:

DisplayImageOptions options = new DisplayImageOptions.Builder()
                // 设置图片在下载期间显示的图片
                .showImageOnLoading(R.drawable.ic_stub)
                // 设置图片Uri为空或是错误的时候显示的图片
                .showImageForEmptyUri(R.drawable.ic_stub)
                // 设置图片加载/解码过程中错误时候显示的图片
                .showImageOnFail(R.drawable.ic_error)
                // 设置下载的图片是否缓存在内存中
                .cacheInMemory(false)
                // 设置下载的图片是否缓存在SD卡中
                .cacheOnDisc(true)
                // 保留Exif信息
                .considerExifParams(true)
                // 设置图片以如何的编码方式显示
                .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
                // 设置图片的解码类型
                .bitmapConfig(Bitmap.Config.RGB_565)
                // 设置图片下载前的延迟
                .delayBeforeLoading(100)
                // 设置图片在下载前是否重置,复位
                .resetViewBeforeLoading(true)
                //是否设置为圆角,弧度为多少
                .displayer(new RoundedBitmapDisplayer(20))
                // 淡入
                .displayer(new FadeInBitmapDisplayer(100))
                .build();

最后附赠两张流程图,不只是ImageLoader是这样的,实际其他图片加载框架也是这样的原理:

62811377782909

uil_flow

评论

0条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注