解决-Glide preload()的一个坑

通常为了让图片能够更快地加载出来,会给图片做预加载。Glide里预加载的函数为preload()。

  • 使用姿势:Glide.with(context).load(url).preload()

  • 奇怪的现象:如果还有一个地方也在使用预加载,比如我有一个Activity的background需要预加载,为了达到加载完成后将background显示出来的目的,需要这样使用:

Glide.with(context)
.load(url)
.listener(new RequestListener<Drawable>() {
    @Override
    public boolean onLoadFailed(@Nullable GlideException e, Object model,  Target<Drawable> target, boolean isFirstResource) {
   return false;
    }

    @Override
    public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
     backgroundView.setBackground(resource);
  return false;
    }})
.preload();

同时,这个Activity中还有一个Gridview也需要预加载图片,则会出现Activity的background跟随Gridview的滑动而变化的奇怪现象。

  • 产生原因
    这个backgroundView是一个自定义的View,在排除布局中其它元素的影响以及backgroundView自己调用setBackground()等一系列改变背景的方法之后,唯一的可能性就是Glide底层对这个View的bitmap进行了重绘。

通过查看Glide设计,发现确实存在这种可能。因为Glide preload一个对象时,这个drawable并没有和哪个View绑定,该bitmap资源是放入BitmapPool中的。BitmapPool中的对象是可以复用的,因此如果另一张图片被解析成了Bitmap,而此Bitmap正好用了刚才那张图片的控件来存放解析后的数据,这样就会出现backgroundView的图片变成新的图片。

  • 解决办法
    使用Glide的preload预加载图片,然后设置背景drawable这种方式是行不通的。可以让backgroundView继承ImageView。直接使用Glide.with(context).load(url).into(imageview)加载该背景图片。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值