【问题标题】:Calling lifecycle.addObserver from a Kotlin abstract class从 Kotlin 抽象类调用生命周期.addObserver
【发布时间】:2020-08-07 10:48:15
【问题描述】:
我有一个实现DefaultLifecycleObserver 的抽象类。我想从init 块中调用lifecycle.addObserver(this),但它说“在非最终类MyAbstractClass 的构造函数中泄漏'this'”。
我的代码:
abstract class MyAbstractClass(protected val activity: AppCompatActivity) : DefaultLifecycleObserver {
init {
activity.lifecycle.addObserver(this)
}
.
.
.
}
我可以将这行代码移动到扩展这个抽象类的每个 final 类的 init 块中,但我不喜欢这个想法,特别是因为我想保证每个新类将来都会扩展 MyAbstractClass也会调用它。
有没有更好的地方来调用它而不造成泄漏?
【问题讨论】:
标签:
kotlin
abstract-class
android-lifecycle
addobserver
【解决方案1】:
我想你可以发布你的调用,这样它只会在对象完全实例化后发生:
abstract class MyAbstractClass(protected val activity: AppCompatActivity) : DefaultLifecycleObserver {
init {
Handler(Looper.getMainLooper()).post {
activity.lifecycle.addObserver(this)
}
}
}
或者,创建一个可以附加到构造函数调用的扩展函数可能就不那么令人惊讶了。然后您可以立即明确地开始观察。不过,您必须将activity 公开。通过在这样的扩展中定义它,您的子类可以调用它并返回自己,这样您就可以将它链接到构造函数调用。
fun <T: MyAbstractClass> T.alsoBegin(): T {
activity.lifecycle.addObserver(this)
return this
}
val foo = SomeImplementation(myActivity).alsoBegin()