具有 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
我想知道 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