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 的概念介于 innernested class 之间。 nested class 是你在另一个 class 中声明一些 class Foo 时默认得到的。嵌套的 classes 没有对封闭 class 的隐式引用(在这方面它们类似于 Java 的内部静态 classes)。你的 MyOptionMenuBarHandler class 就是这样。

如果您想将引用 class 添加到您的内部 class,您可以将其标记为 inner

简而言之

  1. Kotlin 和 Java 在内部 class 方面有不同的默认值。在 Kotlin 中,内部 class 没有引用默认包含 class,在 java 中它有。
  2. 如果您想在 Kotlin 中隐式引用外部 class,请将内部 class 标记为 inner
  3. 如果您不想在 Java 中有这样的引用,请将内部 class 标记为 static