Android 中用于 kotlin 的静态等效项,以避免处理程序内存泄漏
static equivalent in Android for kotlin to avoid handler memory leaks
当我在使用 java 之前在 Android 中使用处理程序时,我会收到一条 Android Studio lint 消息说我应该使用静态处理程序,否则会发生内存泄漏.由于Kotlin没有static关键字,我应该怎么处理呢?这是我的 class:
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 时我需要做些什么来避免内存泄漏?
Lint 告诉您将内部 Handler
class 标记为 static
以防止编译器将包含 class 的引用添加到 Handler
实现中(它默认将它添加到所有内部非静态 classes),因为这可能会造成内存泄漏。
现在,Kotlin 的概念介于 inner
和 nested
class 之间。 nested
class 是你在另一个 class 中声明一些 class Foo
时默认得到的。嵌套的 classes 没有对封闭 class 的隐式引用(在这方面它们类似于 Java 的内部静态 classes)。你的 MyOptionMenuBarHandler
class 就是这样。
如果您想将引用 class 添加到您的内部 class,您可以将其标记为 inner
。
简而言之:
- Kotlin 和 Java 在内部 class 方面有不同的默认值。在 Kotlin 中,内部 class 没有引用默认包含 class,在 java 中它有。
- 如果您想在 Kotlin 中隐式引用外部 class,请将内部 class 标记为
inner
。
- 如果您不想在 Java 中有这样的引用,请将内部 class 标记为
static
。
当我在使用 java 之前在 Android 中使用处理程序时,我会收到一条 Android Studio lint 消息说我应该使用静态处理程序,否则会发生内存泄漏.由于Kotlin没有static关键字,我应该怎么处理呢?这是我的 class:
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 时我需要做些什么来避免内存泄漏?
Lint 告诉您将内部 Handler
class 标记为 static
以防止编译器将包含 class 的引用添加到 Handler
实现中(它默认将它添加到所有内部非静态 classes),因为这可能会造成内存泄漏。
现在,Kotlin 的概念介于 inner
和 nested
class 之间。 nested
class 是你在另一个 class 中声明一些 class Foo
时默认得到的。嵌套的 classes 没有对封闭 class 的隐式引用(在这方面它们类似于 Java 的内部静态 classes)。你的 MyOptionMenuBarHandler
class 就是这样。
如果您想将引用 class 添加到您的内部 class,您可以将其标记为 inner
。
简而言之:
- Kotlin 和 Java 在内部 class 方面有不同的默认值。在 Kotlin 中,内部 class 没有引用默认包含 class,在 java 中它有。
- 如果您想在 Kotlin 中隐式引用外部 class,请将内部 class 标记为
inner
。 - 如果您不想在 Java 中有这样的引用,请将内部 class 标记为
static
。