项目中使用的是之前的ImageLoader,这个图片加载库很久没有维护了,决定使用Glide替换掉ImageLoader
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感觉很挫,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来实现图片的更新,这就需要我们要去维护每个头像的版本号,通过版本号去决定是否去网络加载还是显示本地图片