首页 > 解决方案 > 带有活动上下文的处理程序类会导致内存泄漏吗?

问题描述

我想知道类是否在其构造函数中使用活动的上下文扩展 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 持有活动的上下文。

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

谢谢。

标签: androidmemory-leaksandroid-handler

解决方案


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

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

最后,使用leakcanary 来检测代码中的泄漏。这是入门指南


推荐阅读