Glide 加载优化

  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,完美解决以上问题。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值