java - AccessibilityManager.sInstance 是否会导致内存泄漏?
问题描述
我有一个包含片段的活动。运行 Leak Canary,我看到活动有内存泄漏。
我已经注释掉了从活动和片段到活动仅显示片段并且片段具有空的 xml 布局的所有代码。我在这两个文件或 xml 中都没有可访问性。
* AccessibilityManager$1.!(this$0)! (anonymous subclass of android.view.accessibility.IAccessibilityManagerClient$Stub)
* ↳ AccessibilityManager.!(mTouchExplorationStateChangeListeners)!
* ↳ CopyOnWriteArrayList.!(elements)!
* ↳ array Object[].!([2])!
* ↳ AccessibilityManagerCompat$TouchExplorationStateChangeListenerWrapper.!(mListener)!
* ↳ BaseTransientBottomBar$SnackbarBaseLayout$1.!(this$0)! (anonymous implementation of android.support.v4.view.accessibility.AccessibilityManagerCompat$TouchExplorationStateChangeListener)
* ↳ Snackbar$SnackbarLayout.mContext
* ↳ ContextThemeWrapper.mBase
* ↳ MessagesActivity
解决方案
好的,我确实想通了。这是 Snackbar 中的内存泄漏,它是如何重现的:https ://github.com/GC-Xi/SnackbarBug
繁殖方式
- 创建一个 Snackbar 并在 Activity 中引用它
- 不要调用 Snackbar.show()
- 打开和关闭活动
- 请注意,Activity 没有被垃圾收集,因为小吃吧有对它的引用
原因
SnackbarBaseLayout
构造函数addTouchExplorationStateChangeListener()
和removeTouchExplorationStateChangeListener()
. _ 可能应该从onDetachedFromWindow()
哪里调用,因为除非被调用,否则它不会附加到窗口。addTouchExplorationStateChangeListener()
onAttachedToWindow()
SnackbarBaseLayout
Snackbar.show()
解决方案 1
更新到 AndroidX 并改用 com.google.android.material.snackbar.Snackbar。 https://github.com/GC-Xi/SnackbarBug/tree/solution1
解决方案 2
除非您准备好展示它,否则不要创建 Snackbar。 https://github.com/GC-Xi/SnackbarBug/tree/solution2
推荐阅读
- javascript - 邮递员正则表达式 - SyntaxError:无效或意外的令牌
- docker - Azure Devops Server 自托管 docker 代理设置 SSL 错误
- kubernetes - 在 Keycloak 和 Kubernetes 中正确管理用户会话
- java - 为什么 Eclipse 2020-09 中的 WindowBuilder 编辑器中的设计选项卡为空?
- python - 如何在 tkinter 的组合框中设置默认值?
- antlr - 如何在解析规则中获取标记的行?
- mongodb - 如何为在 kubernetes 集群上运行的 Kafka Connect 配置 MongoDB 官方源连接器
- git - 清理 Git 存储库的问题
- coldfusion - 如何在 CommandBox CF 2018 中获取实例名称?
- c++ - c++ 如何巧妙计算元素频率?