使用glide填过的各种坑

原创 2017年01月05日 11:19:44

使用版本glide-3.7.0

坑一:

无法手动刷新缓存,只能改变key添加自定义签名,我是将头像版本号放到key中了,因为取头像是根据手机号取的,头像url路径并不会变,而且首次加载时并不能拿到版本号。

builder.signature(new StringSignature(etag));

坑二:

从磁盘缓存加载头像时太慢,导致能看到由默认图变到头像的过程,给人感觉头像闪了一下,体验不好。因为glide的磁盘缓存加载逻辑放到了工作线程中,提高了滑动时的流畅度,但是也降低了加载速度,没想到好办法解决;

坑三:

服务器返回的是xml数据,需要解析完xml才能获取头像byte[],好在glide有现成的api

builder.asBitmap().imageDecoder(decoder)

public class XmlBitmapDecoder implements ResourceDecoder<InputStream, Bitmap> {
	private static final String ID = "XmlBitmapDecoder.com.chinamobile.rcs.contacts.glide";
	private String id;
	private final BitmapPool bitmapPool;

	public XmlBitmapDecoder(BitmapPool bitmapPool) {
		this.bitmapPool = bitmapPool;
	}
	
	@Override
	public Resource<Bitmap> decode(InputStream is, int width, int height) throws IOException {
		AvatarModel avatarModel = Utils.stream2Avatar(is);
		byte[] datas = avatarModel.getData();
		Bitmap bitmap = BitmapFactory.decodeByteArray(datas, 0, datas.length);
		return BitmapResource.obtain(bitmap,bitmapPool);
	}

	@Override
	public String getId() {
		if (this.id == null) {
			this.id = ID;
		}
		return this.id;
	}

}
坑四:

消息列表中因为有不同的消息类型,默认头像也不一样,glide占位图不设置时,会设置null,所以onLoadStarted方法里需要区分开;

坑五:

token验证,切圆角图,这个相对容易实现


坑六:

某些场景需要跳过缓存强制从网络拉取,但是需要先用缓存的头像当占位图,这点上glide没有开放现成的api,实现方式有点迂回:

DrawableTypeRequest<MyGlideUrl> builder = Glide.with(mContext).using(new StreamModelLoader<MyGlideUrl>() {

			@Override
			public DataFetcher<InputStream> getResourceFetcher(final MyGlideUrl model, int arg1, int arg2) {
				return new DataFetcher<InputStream>() {
					@Override
					public InputStream loadData(Priority priority) throws Exception {
						throw new IOException();
						// do nothing
					}

					@Override
					public void cleanup() {

					}

					@Override
					public String getId() {
						return model.getCacheKey();
					}

					@Override
					public void cancel() {

					}
				};
			}
		}).load(glideUrl);
重点是loadData里边不做任何事,正常情况下这里本该写从网络拉取头像获取输入流的逻辑。这样就能变相实现从缓存拿到bitmap。


坑七:

还是加载慢的问题,但是有时候从memory缓存里加载竟然也需要50,60ms,打开glide调试,发现从缓存加载只需要零点几毫秒,但是从我代码调用到真正发起请求竟然用了大部分时间,有人说是得到view宽高后才会发起请求,于是添加.override(w, h),效果不明显。


已经决定自己实现一套头像加载逻辑了,用第三方的实在是不够灵活

APP图片缓存与Glide之signature的分析

在缓存网络图片的过程中,有一种情况是图片的地址不变,但图片发生了变化,如果只按照图片的地址进行缓存,在加载缓存中的图片时就会发生图片一直显示为旧图的现象。 本文就此问题结合Glide的处理方法进行简要...
  • CShawnX
  • CShawnX
  • 2016年06月07日 09:27
  • 8946

【Glide】重新加载图片

1、想要重新加载图片(URL没变,图片变了)2、发现无法重新加载,以为是有缓存的原因于是使用clear(view),但是只能清除控件上的图片,并不能真的清除缓存 又使用clearMemory(),还...
  • u013420865
  • u013420865
  • 2016年11月17日 11:28
  • 2145

Glide加载相同URL时由于缓存无法更新图片的问题

在使用Glide加载图片时,如果设置了缓存,那么无论图片是否有了更新,只要URL不变,那么就会使用内存缓存或者磁盘缓存的图片,导致加载出来的图片没有更新的问题,因此有两种解决方法: 如果...
  • zhifanxu
  • zhifanxu
  • 2018年01月05日 15:02
  • 85

Android图片加载框架最全解析(三),深入探究Glide的缓存机制

本文转载自:http://blog.csdn.net/guolin_blog/article/details/54895665 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 ...
  • cp_Mark
  • cp_Mark
  • 2017年08月31日 16:17
  • 243

图片加载框架Glide解析

Glide是一个高效、开源、 Android设备上的媒体管理框架,它遵循BSD、MIT以及Apache 2.0协议发布。Glide具有获取、解码和展示视频剧照、图片、动画等功能,它还有灵活的API,这...
  • u011228356
  • u011228356
  • 2015年04月13日 15:32
  • 35967

Glide使用,踩过的坑

1.Glide特点 使用简单 可配置度高,自适应程度高 支持常见图片格式: Jpg png gif webp 支持多种数据源:  网络、本地、资源、Assets 等 高效缓存策略,支持M...
  • TS_learner
  • TS_learner
  • 2017年05月12日 09:14
  • 1551

gradle各版本下载地址

gradle各版本下载地址:http://services.gradle.org/distributions 以前都是手动下载gradle的文件,然后修改的,现在从官网上面来解决更新gradle...
  • wangqjpp
  • wangqjpp
  • 2016年08月16日 11:17
  • 65827

Glide里的一些坑

最近在项目中使用了Glide作为图片加载的方法,这里整理了Glide的基本使用方法,以及在使用过程中可能遇到的问题的解决方案。使用Glide加载本地图片的缩略图的时候明显感觉速度非常快,以致原本打算在...
  • qibanxuehua
  • qibanxuehua
  • 2017年02月08日 15:35
  • 1577

Glide使用过程中遇到的坑

项目之前使用的图片加载库是universal-image-loader,但是此库已经好久不维护了,同时也发现了更加不错的图片加载库,也就是Glide,用起来很方便并且内存占用量还很令人满意,所以决定大...
  • lvshuchangyin
  • lvshuchangyin
  • 2017年02月23日 13:49
  • 2417

glide添加header请求

glide添加header GlideUrl glideUrl = new GlideUrl(url, new LazyHeaders.Builder() .addHeader(“Cookie”,...
  • binzai_16
  • binzai_16
  • 2016年12月12日 14:52
  • 577
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用glide填过的各种坑
举报原因:
原因补充:

(最多只允许输入30个字)