kotlin构造函数参数丢失?

时间:2018-12-18 02:59:49

标签: android kotlin constructor android-glide

我为Glide编写了MaskShapeTransformation,所以我想在我的Transformation中传递一个drawable并使用原始位图绘制此drawable来制作蒙版效果。

在一开始,我通过这样的drawable以及一个SoftReference来避免内存泄漏。

class MaskShapeTransformation(drawable: Drawable): BitmapTransformation() {
       private val weakDrawable = SoftReference(drawable)
       .....
}

但是当我用weakDrawable.get()?绘制时,该绘制为null enter image description here

我不知道为什么,但是我尝试了一切,直到更改了构造函数,我只是将val添加到这样的可修改可绘制对象中

class MaskShapeTransformation(val drawable: Drawable): BitmapTransformation() {
       private val weakDrawable = SoftReference(drawable)
       .....
}

出奇的事情发生了,weakDrawable.get()?运行良好! enter image description here

我很困惑,有人可以告诉我为什么吗?

1 个答案:

答案 0 :(得分:4)

第一点:WeakReference仅会保留引用,只要其他条件也能使引用保持有效。

第二点:Kotlin构造函数的语法意味着非常不同:

  • MaskShapeTransformation(drawable: Drawable)
  • MaskShapeTransformation(val drawable: Drawable)

第一个只是说必须将Drawable传递给构造函数。第二个也这么说,但是在类上创建一个字段,并使用传递的值将其初始化。这意味着第二种形式为您提供了一个具有两个字段的对象:

  • drawable:保存传入的drawable
  • weakDrawable:弱引用包装drawable

将它们放在一起,现在您有了一个对Drawable具有强引用的类,这意味着弱引用也将保持活动状态。