Когда я использовал обработчики на 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
.
Короче говоря :
inner
. static
.