android - 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>
解决方案
第一点:WeakReference
粗略地说,只要其他东西也使引用保持活动状态,就会保留引用。
第二点:Kotlin 的构造函数语法意味着这些是非常不同的:
MaskShapeTransformation(drawable: Drawable)
MaskShapeTransformation(val drawable: Drawable)
第一个只是说您必须将 a 传递Drawable
给构造函数。第二个也这么说,但也在类上创建一个字段并用传递的值初始化它。这意味着第二种形式为您提供了一个具有两个字段的对象:
drawable
: 保存传入的drawableweakDrawable
: 弱引用包装drawable
。
把它们放在一起,现在你有了一个对 Drawable 有强引用的类,这意味着弱引用也将保持活动状态。
推荐阅读
- python - 编写通用代码来构造元组和命名元组
- python - Docker 连接到“现有”数据库,但显示为空
- c# - DLL 中的函数总是返回 null
- python - (Python 3.2): if 语句不满足条件时退出
- mysql - InnoDB 全文搜索死锁
- angular - 发生未处理的异常:无法从“/project 到 docker 中找到模块“@angular-devkit/build-angular”
- mongodb - Mongoose 通过计数对元素进行排序
- python - Pandas DataFrames If else 条件多列
- android - Flutter Firebase:地图类型与子集合
- mysql - mysql唯一约束因空值而失败?