我是靠谱客的博主 强健高山,最近开发中收集的这篇文章主要介绍解决-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)加载该背景图片。

最后

以上就是强健高山为你收集整理的解决-Glide preload()的一个坑的全部内容,希望文章能够帮你解决解决-Glide preload()的一个坑所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部