статический эквивалент в Android для kotlin, чтобы избежать утечек памяти обработчика

Когда я использовал обработчики на Android перед использованием java, я получил сообщение linux для Android Studio, в котором говорилось, что я должен использовать статический обработчик, иначе произойдет утечка памяти. Поскольку у Kotlin нет статического ключевого слова, как мне его обрабатывать? Вот мой класс:

class TaskDetailActivity : AppCompatActivity() { private val handlerComment = MyOptionMenuBarHandler(this) private fun setUpToolBar() { handlerComment.sendEmptyMessage(0) } private class MyOptionMenuBarHandler(activity: TaskDetailActivity) : Handler() { private val activity: WeakReference<TaskDetailActivity> = WeakReference<TaskDetailActivity>(activity) override fun handleMessage(msg: Message) { //do the work ..... } } } 

Есть ли что-то особенное, что мне нужно сделать, чтобы избежать утечек памяти с помощью Kotlin?

Solutions Collecting From Web of "статический эквивалент в Android для kotlin, чтобы избежать утечек памяти обработчика"

Линт указывает вам, чтобы ваш внутренний класс Handler static чтобы компилятор не добавлял ссылку вмещающего класса в реализацию Handler (он по умолчанию добавляет все внутренние нестатические классы), поскольку это может привести к утечке памяти.

Теперь у Котлина есть понятия между inner и nested классами. nested класс – это то, что вы получаете по умолчанию, если вы объявляете некоторый класс Foo внутри другого класса. Вложенные классы не имеют неявной ссылки на охватывающий класс (они похожи на внутренние статические классы Java в этом отношении). Класс MyOptionMenuBarHandler именно MyOptionMenuBarHandler .

Если вы хотите добавить ссылку на класс включения в свой внутренний класс, вы можете пометить его как inner .

Короче говоря :

  1. Kotlin и Java имеют разные значения по умолчанию для внутреннего класса. В Kotlin внутренний класс не имеет ссылки на класс включения по умолчанию, в java он делает.
  2. Если вы хотите иметь неявную ссылку на внешний класс в Kotlin, пометьте внутренний класс как inner .
  3. Если вы не хотите иметь такую ​​ссылку в Java, пометьте внутренний класс как static .