Glide使用及踩坑日记
2018-01-14 14:05
351 查看
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<GlideParam> { private GlideParam params; public DecryptModdelLoader(GlideParam params){ this.params = params; } @Override public DataFetcher<InputStream> getResourceFetcher(GlideParam glideParam, int i, int i1) { return new DecryptDataFetcher(params); }
}
3.定义DataFetcher
class DecryptDataFetcher implements DataFetcher<InputStream> { 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来实现图片的更新,这就需要我们要去维护每个头像的版本号,通过版本号去决定是否去网络加载还是显示本地图片
相关文章推荐
- 使用Glide动态加载圆形图片和圆角图片
- Android开源框架Glide的使用
- 使用MVP+RxAndroid+DroiBaaS打造云后台App—校园日记
- JavaScript 新手的踩坑日记
- 【DuerOS开发日记】2.打造属于自己的小度(1):使用PythonSDK
- C日记——泛型的使用
- 君正4750开发板使用日记4-QT Embedded、Tslib、QT for VS2008的配置与编译
- solidworks二次开发 学习日记--3使用solidworks sdk api 和vc做简单开发
- 使用Glide实现毛玻璃的效果
- android Glide图片框架最全使用说明
- 使用matlab中的powergui对采集的数据进行谐波分析#实验日记#
- 解决使用Glide加载图片的时候会出现拉伸的情况,即使设置了centerCrop()也没用的问题
- Glide使用详细标注
- Glide使用详解(一)
- 使用glide 如何实现高度自适应t图片:
- Android应用程序中,使用Glide下载和处理图像的教程
- Glide使用探索(二)——磁盘缓存无效化
- Glide 使用
- Glide的使用