开始使用Glide图片缓存

最近看了一篇有Trinea写的文章Android 三大图片缓存原理、特性对比 里面介绍了关于世面上主流的图片缓存开源库中,常见的有Universal ImageLoader、Picasso、Fresco、Glide这四个库前面三个都体验过了且Uiversal ImageLoader和Fresco都曾在项目中使用过了Picasso之前也玩过,唯独Glide没有碰过只知道它的存在而已。

Glide是有Google开源的一款图片缓存开源库在GitHub上的地址是:https://github.com/bumptech/glide ,An image loading and caching library for Android focused on smooth scrolling意思是一款用于Android上下载和缓存的图片库注重于滑动滚动。

在AndroidStudio中加入依赖就可以开始使用它了。

dependencies {
    compile 'com.github.bumptech.glide:glide:3.5.2'
    compile 'com.android.support:support-v4:22.0.0'
}

其中v4包主要是因为Glide会根据Fragment的生命周期来进行自我管理,而且我们平时开发中也需要用到v4包所以这句话没差的。
在使用的时候非常简单一句话就可以了类似如下:

// 第一种把图片按 长=match_parent 宽=200dp显示Glide.with(activity).load(Images.imageUrls[position]).into(holder.image);
// 第二种 长宽都是wrap_content      Glide.with(activity).load(Images.imageUrls[position]).into(holder.image);
// 第三种 自己定义宽高 -> 如果使用override(300, 300)和placeholder同时存在的时候那么加载出来的图片宽度会以placeholder中设置的大小来显示
        LinearLayout.LayoutParams param = (LinearLayout.LayoutParams) holder.image.getLayoutParams();
        param.width = 300;
        param.height = 300;
        Glide.with(activity).load(Images.imageUrls[position])
                .placeholder(R.drawable.corner_white_shape)
                .error(R.drawable.corner_white_shape)
                .crossFade()
                .into(holder.image);

注意Glide中是使用RGB565来缓存Bitmap这样内存占用比较少,我们也可以自定义自己显示的Format但是如果使用ARGB_8888会导致占用的内存较高而且RGB565相对ARGB_8888肉眼是看不出来有特别的差别所以还是使用默认的即可。

placeholder(R.drawable.corner_white_shape)意思是图片正在加载中的占位图
error(R.drawable.corner_white_shape)意思是图片加载失败时显示的占位图
而且Glide也支持Gif显示,这一点跟Fresco功能相似内嵌了GifDecoder开源库


图片缓存位置变更

简单跟踪了下源码发现它的图片缓存位置是在/data/data/包名/image_manager_disk_cache应用的内部存储目录下,所以我们可以自己定义把图片缓存到SD卡上。

public class ExternalCacheDiskCacheFactory extends DiskLruCacheFactory {
    public ExternalCacheDiskCacheFactory(Context context) {
        this(context, DiskCache.Factory.DEFAULT_DISK_CACHE_DIR, DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE);
    }

    public ExternalCacheDiskCacheFactory(Context context, int diskCacheSize) {
        this(context, DiskCache.Factory.DEFAULT_DISK_CACHE_DIR, diskCacheSize);
    }

    public ExternalCacheDiskCacheFactory(final Context context, final String diskCacheName, int diskCacheSize) {
        super(new CacheDirectoryGetter() {
            @Override
            public File getCacheDirectory() {
                File cacheDirectory;
                if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                    // 如果SD卡可以用的话把图片缓存到SD卡上
                    cacheDirectory = context.getExternalCacheDir();
                } else {
                    // 把图片缓存到应用data/data/包/...下
                    cacheDirectory = context.getCacheDir();
                }
                if (cacheDirectory == null) {
                    return null;
                }
                if (diskCacheName != null) {
                    return new File(cacheDirectory, diskCacheName);
                }
                return cacheDirectory;
            }
        }, diskCacheSize);
    }
}

我们需要自己定义个DiskLruCacheFactory然后重写CacheDirectoryGetter的getCacheDirectory方法在SD可用的情况下保存到SD否则保存到内部存储空间下。

使用OKHttp进行网络请求图片
虽然Glide使用HttpUrlConnection来网络请求但是毕竟在5.0一下仍然没有优势因为使用在5.0开始Android中HttpUrlConnection也使用OkHttp来进行网络请求封装所以我们也使用OKHttp来封装一层
首先引入OKHttp依赖和Glide封装好的OkHttp请求依赖

compile 'com.github.bumptech.glide:okhttp-integration:1.3.1@aar'
compile 'com.squareup.okhttp:okhttp:2.2.0'

完成之后在GlideMudle中配置

glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory());

这样完整的图片地址变更和OkHttp网络请求配置的GlideMudle如下:

public class GlideConfiguration implements GlideModule {

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        // 配置图片将缓存到SD卡
        ExternalCacheDiskCacheFactory externalCacheDiskCacheFactory = new ExternalCacheDiskCacheFactory(context);
        builder.setDiskCache(externalCacheDiskCacheFactory);

        // 如果配置图片将缓存到SD卡后那么getPhotoCacheDir返回仍然没有变化
        Log.w("jayuchou", Glide.getPhotoCacheDir(context).getPath());
    }

    @Override
    public void registerComponents(Context context, Glide glide) {
        // 配置使用OKHttp来请求网络
        glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory());
    }
}

当然还有一步非常重要就是把配置应用到应用中:

<meta-data android:name="com.glide.demo.GlideConfiguration" android:value="GlideModule"/>

这样都配置完成后我们再进行运行体验一次应用确实爽,当然还有几个注意点:
1.placeholder和error无法使用颜色来当占位图所以我们需要把颜色封装到shape来进行加载占位图

2.Glide在加载大型图片没优势还会存在OOM

3.如果ImageView的宽高是wrap_content时设置了placeholder那么就会以placeholder中设置的占位图来显示最终的图片如果是一个shape那么将看不到图片,解决的方式就是在加载之前给ImageView设置好宽高值

4.Glide的源码整体感觉没有UIL那样通俗易懂所以需要读懂再使用避免出现问题时无从下手

该Demo已上传到GitHub了可以查看:
https://github.com/Neacy/GlideTest

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值