Вызов lifecycle.addObserver из абстрактного класса Kotlin

У меня есть абстрактный класс, который реализует DefaultLifecycleObserver. Я хотел бы вызвать lifecycle.addObserver(this) из блока init, но он говорит Leaking 'this' в конструкторе нефинального класса MyAbstractClass.

Мой код:

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

Я могу переместить эту строку кода в блок инициализации каждого финального класса, который расширяет этот абстрактный класс, но мне не нравится эта идея, особенно потому, что я хочу гарантировать, что каждый новый класс, который будет расширять MyAbstractClass в будущем, будет вызывать его. также. Есть ли лучшее место, чтобы вызвать это, не создавая утечку?


person Hadas Kaminsky    schedule 06.08.2020    source источник


Ответы (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()
person Tenfour04    schedule 07.08.2020