私は、フラグメントを含む活性を有しています。リークカナリアを実行すると、私は活動がメモリリークを持っていることがわかります。
私は、アクティビティがフラグメントのみを表示している場合に活性および断片からすべてのコードをコメントアウトしており、フラグメントが空の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
OK、私は実際にそれを考え出しました。これは、スナックバーでのメモリリークであり、ここでそれを再現することができる方法です。https://github.com/GC-Xi/SnackbarBug
再生への道
- スナックバーを作成し、活動にそれを参照
- )(Snackbar.showを呼び出さないでください。
- 開閉活動
- スナックバーは、それへの参照を持っているので、活動がガベージコレクトではないことに注意してください
原因
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
あなたはそれを表示する準備ができている場合を除きスナックバーを作成しないでください。https://github.com/GC-Xi/SnackbarBug/tree/solution2