从 Kotlin 摘要 class 调用 lifecycle.addObserver

Calling lifecycle.addObserver from a Kotlin abstract class

我有一个实现 DefaultLifecycleObserver 的抽象 class。我想从 init 块调用 lifecycle.addObserver(this),但它说 "Leaking 'this' in constructor of non-final class MyAbstractClass".

我的代码:

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

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

我想你可以 post 你的调用,所以它只发生在对象完全实例化之后:

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

或者创建一个可以附加到构造函数调用上的扩展函数可能并不令人惊讶。然后你可以明确地立即开始观察。不过,您必须制作 activity public。通过在这样的扩展中定义它,您的子类可以调用它和 return 自己,因此您可以将它链接到构造函数调用。

fun <T: MyAbstractClass> T.alsoBegin(): T {
    activity.lifecycle.addObserver(this)
    return this
}

val foo = SomeImplementation(myActivity).alsoBegin()