Android一般情况使用Glide加载图片,但是使用不注意就会有些问题:比较大的list的图片列表快速滚动,当前的图片需要等前面的加载才可以加载,分析如下:
1. listview的item中使用glide加载图片,当有需要对加载图片二次处理使用重新simpleTarget,然后给into,如下所示
Glide.with(mContext).load("http://xxxx.png")
.crossFade()
.error(R.drawable.error_photo)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(target);
这样处理有个很大的问题是当列表比较大,快速往下拉动,滚到比较远时,图片比较多情况下,glide不会取消不可见view的加载,需要等前面的都依次加载完才加载当前url;
2. 因此要使用glide自动取消不见的view的加载,需要into到具体的view,不能使用target做法;
另外该view不可设置Tag,因为glide里面要使用;强制设置的话,ViewTarget里面会抛异常:
public Request getRequest() {
Object tag = this.getTag();
Request request = null;
if(tag != null) {
if(!(tag instanceof Request)) {
throw new IllegalArgumentException("You must not call setTag() on a view Glide is targeting");
}
request = (Request)tag;
}
return request;
}
3. 那假如需要处理glide去拉完图片后需要额外其他处理,不适用target,该如何处理?可以使用RequestListener,如下所示
.listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model,
Target<GlideDrawable> target,
boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model,
Target<GlideDrawable> target,
boolean isFromMemoryCache,
return false;
}
})
再更新,发现glide加载另外一个问题是listview中item的icon加载错乱,即当前icon使用前面已加载的icon;最后排查为是部分icon没有使用glide加载导致(有些icon使用默认图直接设image,其他的会使用url加载icon);无论默认图还是url都修改为用glide加载,这样就没有加载错乱的问题
------------------------二次更新---------------------------
使用into View时,有跟副作用,使用placeholder设置默认图片,imageview使用fitCenter模式,且改view不是使用固定宽高,首次加载会有尺寸会被放大变形,view滑动不可见,再滑动回来时,这时二次加载的尺寸就正常;
当去掉placeholder时,表现为首次加载时正常,但是layout设置默认图没有,变成空白的问题;
改为simpleTarget时,首次加载时正常,但是不可见的view不会自动取消glide加载的问题。
后来,发现glide里还有个ViewTarget,使用into ViewTarget 即可解决以上的问题:可以自动取消不可见View的glide加载,马上加载当前可见view的icon,完美解决以上问题。