android - 带有活动上下文的处理程序类会导致内存泄漏吗?
问题描述
我想知道类是否在其构造函数中使用活动的上下文扩展 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 持有活动的上下文。
但是在这种情况下如何处理活动的上下文?
谢谢。
解决方案
您的代码中有 2 个泄漏源:
- 在活动生命周期之外使用上下文。您可以通过使用
applicationContext
而不是来避免这种情况context
- 此外,您使用的匿名类
handler.postDelayed
包含对您的活动的引用。所以你需要像这样在 onDestroy 中删除它:
override fun onDestroy() {
super.onDestroy()
handlerWithContext.removeCallbacksAndMessages(null)
}
最后,使用leakcanary 来检测代码中的泄漏。这是入门指南
推荐阅读
- beautifulsoup - 我如何用漂亮的汤解析来自雅虎财经的信息
- java - 时间复杂度 - 将映射条目复制到 Arraylist
- discord.js - 达到特定级别时向用户添加角色的问题
- powerquery - 用电量查询填补时间空白
- c# - 如何更新 Word 文档中的正文和超链接
- angular - 如何在从 col-12 更改为 col-9 时向 css 中的 div 添加过渡效果?
- websocket - 向命名空间的 Socket.io 房间发出广播
- reporting-services - How to not COUNT a value in SSRS matrix when value is NULL
- c++ - 如何在 QStandardItemModel 中查找一行
- powerbi - 一列中有重复值,第二列中有不同值的行