我为Glide编写了MaskShapeTransformation,所以我想在我的Transformation中传递一个drawable并使用原始位图绘制此drawable来制作蒙版效果。
在一开始,我通过这样的drawable以及一个SoftReference来避免内存泄漏。
class MaskShapeTransformation(drawable: Drawable): BitmapTransformation() {
private val weakDrawable = SoftReference(drawable)
.....
}
但是当我用weakDrawable.get()?
绘制时,该绘制为null
我不知道为什么,但是我尝试了一切,直到更改了构造函数,我只是将val
添加到这样的可修改可绘制对象中
class MaskShapeTransformation(val drawable: Drawable): BitmapTransformation() {
private val weakDrawable = SoftReference(drawable)
.....
}
出奇的事情发生了,weakDrawable.get()?
运行良好!
我很困惑,有人可以告诉我为什么吗?
答案 0 :(得分:4)
第一点:WeakReference
仅会保留引用,只要其他条件也能使引用保持有效。
第二点:Kotlin构造函数的语法意味着非常不同:
MaskShapeTransformation(drawable: Drawable)
MaskShapeTransformation(val drawable: Drawable)
第一个只是说必须将Drawable
传递给构造函数。第二个也这么说,但是还在类上创建一个字段,并使用传递的值将其初始化。这意味着第二种形式为您提供了一个具有两个字段的对象:
drawable
:保存传入的drawable weakDrawable
:弱引用包装drawable
。将它们放在一起,现在您有了一个对Drawable具有强引用的类,这意味着弱引用也将保持活动状态。