首页 > 解决方案 > kotlin 构造函数参数缺失?

问题描述

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

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

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

但是当我用weakDrawable.get()?可绘制对象绘制时为空 在此处输入图像描述

我不知道为什么,但我尝试了一切,直到我改变我的构造函数,我只是val像这样添加到修改后的drawable

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

发生了令人惊奇的事情,weakDrawable.get()?工作顺利! 在此处输入图像描述

我很困惑,谁能告诉我这是为什么?</p>

标签: androidkotlinconstructorandroid-glide

解决方案


第一点:WeakReference粗略地说,只要其他东西也使引用保持活动状态,就会保留引用。

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

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

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

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

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


推荐阅读