遇到一个很灵异的现象,记录。
开发中遇到使用Glide加载图片,本来矩形图片加载为圆形。以下为代码:
fun ImageView.load(path: Any) {
if (path is Int) {
this.setImageResource(path)
return
}
Glide.with(context)
.load(path)
.dontAnimate()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.placeholder(this.drawable)
.into(this)
}
holder.getView<ImageView>(R.id.iv_plan_item_detail_bg).load(item.cover)
解决方法:
添加dontTransform()
Glide.with(context)
.load(path)
.dontAnimate()
.dontTransform()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.placeholder(this.drawable)
.into(this)
追溯原因:未知
后续
在一次偶然的时间发现了可能造成上述事件的原因。是因为当前页面别的组件有通过DataBinding加载了圆形图片,执行代码如下:
Glide.with(context)
//加载配置,如圆形处理
.setDefaultRequestOptions(requestOptions)
.load(url)
.into(imageView)
重点在 setDefaultRequestOptions() 方法,由于Glide采用单例设计模式,该方法从命名上可以看出将把当前传入的配置设置为默认配置供后续使用,也就是在下一次重设配置之前,所有的默认配置都将参考这里的入参。
通常除了在初始化的时候是不能这么使用的,修改起来也比较容易,直接替换成**apply()**即可,如下:
Glide.with(context)
.load(url)
.apply(requestOptions)
.into(imageView)
总结
一定要慎用类似 setDefaultXXX 等方法,知道调用位置还好,如果不知道就会非常难排查问题。
想了解具体原理的可以参考后面写的这一篇 Glide setDefaultRequestOptions 源码分析