java - 为什么 AccessibilityManager.sInstance 会导致内存泄漏?

标签 java android android-activity leakcanary

我有一个包含 fragment 的 Activity 。运行 Leak Canary,我发现该 Activity 存在内存泄漏。

我已经注释掉了从 Activity 和 fragment 到 Activity 仅显示 fragment 并且 fragment 具有空 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

重现方式

  1. 创建一个 Snackbar 并在 Activity 中引用它
  2. 不要调用 Snackbar.show()
  3. 打开和关闭 Activity
  4. 请注意该 Activity 未被垃圾回收,因为 snackbar 引用了它

原因

SnackbarBaseLayout 在构造函数中调用 addTouchExplorationStateChangeListener() 并在 onDetachedFromWindow() 中调用 removeTouchExplorationStateChangeListener()addTouchExplorationStateChangeListener() 可能应该从 onAttachedToWindow() 调用,因为 SnackbarBaseLayout 没有附加到窗口,除非 Snackbar.show( ) 被调用。

解决方案一

更新到 AndroidX 并改用 com.google.android.material.snackbar.Snackbar。 https://github.com/GC-Xi/SnackbarBug/tree/solution1

方案二

除非您准备好展示它,否则不要创建 Snackbar。 https://github.com/GC-Xi/SnackbarBug/tree/solution2

关于java - 为什么 AccessibilityManager.sInstance 会导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55697904/

相关文章:

java - java中二维字符串数组的困惑

java - 将 4 位灰度字节数组转换为位图 Android

java - Java 中的图像调整大小会导致某些 JPG 损坏

java - @Before 注释在 espresso 测试中被 kotlin 忽略?

java - Android Studio - 应用内更改主题按钮?

android - 我应该放弃 onStop() 或 onDestroy() 中的 View 引用等吗?

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

android - 使用 Andengine 的游戏中出现意外的 arrayIndexOutofBound 异常

android - 待定 Intent 立即触发

Android fragment onCreateView 与 onActivityCreated