Glide使用及踩坑日记

Glide使用及踩坑日记

背景

项目中使用的是之前的ImageLoader,这个图片加载库很久没有维护了,决定使用Glide替换掉ImageLoader

使用Glide

Glide的优点

1.Glide的API使用非常的方便,支持链式调用,支持各种形式源的图片
2.默认使用RGB-565,内存使用更小,滑动更加平滑
3. Glide支持和Glide的生命周期同步
4.可以支持很多特性,比如GIF,动画,可以对图片做各种变换,实现各种效果
5.自己高度自定义,比如:
    支持缓存大小,缓存目录
    支持自定义模块,网络加载可以使用volley,OKhttp
    支持对加密图片的显示

Glide还有很多优点,Glide可以设置回调函数显示加密图片特别符合我们的实际项目情况

缺点

下面讲一讲Glide的缺点

1.Glide支持很多特性,造成使用方法较复杂
2.由于Glide其功能强大,所以使用的方法非常多,其源码也相对的复杂
3.包较大

使用

关于Glide的基本使用可以看下面的博客

https://mrfu.me/2016/02/27/Glide_Getting_Started/

这个博客基本上已经够用了

使用Glide的自定义StreamModelLoader,显示加密图片

我们项目的图片都是加密的,显示之前都需要解密,对于每次显示都去解密把
结果传递给Glide感觉很挫,Glide应该会支持类似的接口!

Glide支持多种形式的数据加载,通过实现StreamModelLoader的接口就可以加载加密的数据!

下面是定义步骤:

1.定义GlideParam

public class GlideParam {

。。。
private InputStream dataInputStream;

public String getFileKey() {


public void setDataInputStream(InputStream inputStream) {
    this.dataInputStream = inputStream;
}

public InputStream getDataInputStream() {
    return dataInputStream;
}

}

2.定义StreamModelLoader

public class DecryptModdelLoader implements StreamModelLoader {

private GlideParam params;

public DecryptModdelLoader(GlideParam params){
    this.params = params;
}
@Override
public DataFetcher getResourceFetcher(GlideParam glideParam, int i, int i1) {


    return new DecryptDataFetcher(params);
}

}

3.定义DataFetcher

class DecryptDataFetcher implements DataFetcher {

private GlideParam glideParam;
public DecryptDataFetcher(GlideParam glideParam) {
    this.glideParam = glideParam;
}
private InputStream mInputStream;
private volatile boolean mIsCanceled;

@Override
public InputStream loadData(Priority priority) throws Exception {

    if (mIsCanceled) {
        return null;
    }
    mInputStream = glideParam.getDataInputStream();
    //解密操作!!
    return mInputStream;
}

@Override
public void cleanup() {

    if (mInputStream != null) {
        try {
            mInputStream.close();
        } catch (IOException e) {

        } finally {
            mInputStream = null;
        }
    }
}

@Override
public String getId() {
    return glideParam.getFileUuid();
}

@Override
public void cancel() {
    mIsCanceled = true;
}
}

loadData最终将解密后的inputStream传递给了Glide!

4.使用

    GlideParam param = new GlideParam();
    param.set   DataInputStream(new DecryptCallback().getFileInputStream(param));
    Glide.with(ApplicationExt.mContext).using(new       DecryptModdelLoader(param)).load(param)....

DecryptCallback就是自定义的解密的接口,将解密后的inputStream传递给GlideParam,GlideParam对象在 将流传给到Glide对应的加载器里面!

自己的踩坑

1.图片闪烁问题

进入界面显示图片,退出后在进入图片会闪一下,这个问题困扰了我好久,
以为是内存不够,Glide缓存失效。。。网上说的各种可能的原因都去试过,
都没有什么卵用。。。过了大概一个星期吧,脑子突然开窍了,    突然想到Glide支持和Activity或者Fragment的生命周期同步,
Glide.with(Context)里面的context如果是Activity或者Fragment的,
那界面destroy了,图片内存缓存就没有了,下次的重新去加载,出现闪烁那就正常不过了
所以Context必须传全局的context(劳资真的想打自己两耳屎)

2.使用Signature,优先去网络加载图片

由于我们的下载头像的接口的URL是固定不变的,如果用户更新了头像,我们在点击到联系人详情的时候,需要去拉联系人头像,并且更新缓存,可以通过skipMemoryCache,diskCacheStrategy None去拉图片,但是拉回来图片后,缓存并没有改变,之后还是显示之前的图片!通过查阅资料,Glide提供了Signature来实现图片的更新,这就需要我们要去维护每个头像的版本号,通过版本号去决定是否去网络加载还是显示本地图片

你可能感兴趣的:(Android,开发)