具有 activity 上下文的处理程序 class 会导致内存泄漏吗?

Can handler class with activity's context cause memory leak?

我想知道 class 在其构造函数中使用 activity 的上下文扩展 Handler 是否会导致 内存泄漏。

这是我的代码。

class MyActivity : AppCompatActivity() {

    class HandlerWithContext(private val context: Context) : Handler(Looper.getMainLooper()) {
        override fun handleMessage(msg: Message) {
            super.handleMessage(msg)
            //Do something with context
        }
    }

    private val handlerWithContext = HandlerWithContext(this)

    private fun runMyHandler() {
        handlerWithContext.postDelayed({

        }, 10000)
    }
}

我猜它会导致内存泄漏,因为 HandlerWithContext 持有 activity 的上下文。

但是在这种情况下如何处理 activity 的上下文?

谢谢。

您的代码中有 2 个泄漏源:

  • 在 activity 生命周期之外使用上下文。您可以使用 applicationContext 而不是 context
  • 来避免这种情况
  • 此外,您与 handler.postDelayed 一起使用的匿名 class 包含对您的 activity 的引用。所以你需要像这样在 onDestroy 中删除它:
    override fun onDestroy() {
        super.onDestroy()
        handlerWithContext.removeCallbacksAndMessages(null)
    }

最后,使用 leakcanary 检测代码中的泄漏。这是 getting started guide