使用版本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),效果不明显。
已经决定自己实现一套头像加载逻辑了,用第三方的实在是不够灵活