当我在使用Java之前在Android中使用处理程序时,我会得到一条Android Studio lint消息,说我应该使用静态处理程序,否则会发生内存泄漏。由于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避免内存泄漏需要做些什么特别的事情吗?
答案 0 :(得分:8)
Lint告诉您将内部Handler
类标记为static
,以防止编译器将封闭类的引用添加到Handler
实现中(默认情况下将其添加到所有内部非-static classes),因为这可能会造成内存泄漏。
现在,Kotlin在inner
和nested
类之间有概念。如果在另一个类中声明了一些类nested
,那么Foo
类是默认获得的。嵌套类没有对封闭类的隐式引用(在这方面它们类似于Java的内部静态类)。你的MyOptionMenuBarHandler
课正是如此。
如果要将封闭类的引用添加到内部类,可以将其标记为inner
。
简而言之:
inner
。static
。