解决-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)加载该背景图片。

猜你喜欢

转载自blog.csdn.net/huanglin_developer/article/details/78039492
今日推荐