статический эквивалент в 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?

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

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

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

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

  1. Kotlin и Java имеют разные значения по умолчанию для внутреннего класса. В Kotlin внутренний класс не имеет ссылки на класс включения по умолчанию, в java он делает.
  2. Если вы хотите иметь неявную ссылку на внешний класс в Kotlin, пометьте внутренний класс как inner .
  3. Если вы не хотите иметь такую ​​ссылку в Java, пометьте внутренний класс как static .
Intereting Posts
Неразрешенная ссылка: SpringExtension с использованием @ExtendWith аннотации Могу ли я сделать конструктор по умолчанию для класса, созданного из файла Kotlin private? Перехват события касания и перенаправление его в зависимости от состояния события движения Могу ли я использовать kotlin.reflect, чтобы получить значение поля Адаптер привязки Android не работает для CustomView как добавить gradle (идеально используя kotlin-dsl) в существующий проект intellij python Как сохранить имена параметров для отладки? Ошибка конфигурации Kotlin Как определить, является ли объект унаследованным от определенного класса в Котлине? Использовать значение аргумента по умолчанию в вызове функции Kotlin Как я могу получить случайное число в Котлине? Как удалить дубликаты объектов с помощью clearBy из списка в Kotlin? compileReleaseKotlin не работает с java.lang.ClassNotFoundException: com.sun.tools.javac.util.Context Ошибка: ошибка преобразования байт-кода в dex: Причина: com.android.dex.DexException: несколько файлов dex определяют Lorg / jetbrains / anko / collections / CollectionsKt; Есть ли способ получить поведение FixedTreadPool с помощью сопрограмм?