0

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

我的代码:

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

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

4

1 回答 1

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()
于 2020-08-07T02:48:15.160 回答