AccessibilityManager.sInstanceは、メモリリークが発生する理由理由はありますか?

AndroidLearner:

私は、フラグメントを含む活性を有しています。リークカナリアを実行すると、私は活動がメモリリークを持っていることがわかります。

私は、アクティビティがフラグメントのみを表示している場合に活性および断片からすべてのコードをコメントアウトしており、フラグメントが空の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

再生への道

  1. スナックバーを作成し、活動にそれを参照
  2. )(Snackbar.showを呼び出さないでください。
  3. 開閉活動
  4. スナックバーは、それへの参照を持っているので、活動がガベージコレクトではないことに注意してください

原因

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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=200842&siteId=1