从Kotlin抽象类调用lifecycle.addObserver



我有一个实现DefaultLifecycleObserver的抽象类。我想从init块调用lifecycle.addObserver(this),但它说"在非最终类MyAbstractClass的构造函数中泄漏"this">

我的代码:

abstract class MyAbstractClass(protected val activity: AppCompatActivity) : DefaultLifecycleObserver {
init {
activity.lifecycle.addObserver(this)
}
.
.
.
}

我可以将这行代码移到扩展这个抽象类的每个最终类的init块,但我不喜欢这个想法,尤其是因为我想保证将来扩展MyAbstractClass的每个新类也会调用它。有没有更好的地方可以在不造成泄漏的情况下进行调用?

我想你可以发布你的调用,这样它只会在对象完全实例化后发生:

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()

相关内容

  • 没有找到相关文章